Introduction

Here goes introduction text

Theory?

Here goes theory. Do we need theory?

Data

Basic description of the data.

Creating document feature matrix.

#DFM creation from tokens, removing stopwords, and stemming.
dfm <- dfm(tok, 
           tolower = TRUE,
           remove=stopwords("SMART"),
           stem=TRUE, 
           verbose = TRUE)
Creating a dfm from a tokens object ...
   ... lowercasing
   ... found 7,701 documents, 55,199 features
   ... dfm_select removed 541 features in 0 documents, padding 0s for 0 features and 0 documents.
   ... stemming features (English), trimmed 21554 feature variants
   ... created a 7,701 x 33,104 sparse dfm
   ... complete. 
Elapsed time: 1.51 seconds.
#Showing 100 most frequrent tokens in DFM
topfeatures(dfm, n = 100)
   nation   countri    intern      unit   develop      peac     world     state     peopl 
   159615    128836    126205    124521    112314     95337     92927     87853     86328 
    secur    econom   general    govern     organ      year    effort     human   assembl 
    64208     56855     54784     49899     48573     47104     43406     42674     41423 
  support communiti   continu    region   problem     polit     right      time    africa 
    41419     41356     40713     39693     38024     36489     36175     31795     31709 
  session   council    import    member  conflict    achiev      work   resolut     south 
    30971     30319     29908     29636     29197     28715     27989     27381     27046 
     hope    global    situat      make    presid    effect       war     relat     order 
    26830     26815     26404     25940     25865     25113     24888     24845     24817 
   republ    confer  principl establish      forc      oper   nuclear    commit     solut 
    24421     24106     23621     23321     23239     23224     23218     22850     22512 
  respons    action    social   process     power   respect   concern     great      made 
    22473     22472     22233     21940     21921     21897     21776     21679     20917 
     call    cooper    polici      part      issu    negoti  independ    weapon  progress 
    20824     20324     20282     20254     20155     20146     19974     19846     19760 
  african  interest    system contribut   increas implement     today      east       end 
    19671     19401     19352     19318     19192     19175     19155     18887     18872 
secretari agreement territori    remain       arm    recent     posit      live  challeng 
    18709     18389     17662     17623     17336     17177     16949     16771     16616 
     meet   charter    result   resourc      area  democrat     major     adopt     ensur 
    16524     16408     16377     16337     16335     16286     16248     16220     16098 
      law 
    16022 
#Removing any digits. `dfm` picks up any separated digits, not digits that are part of tokens.
#Removing any punctuation. `dfm` picks up any punctuation unless it's part of a token.
#Removing any tokens less than four characters.
dfm.m <- dfm_select(dfm, c("[\\d-]", "[[:punct:]]", "^.{1,3}$"), selection = "remove", 
                    valuetype="regex", verbose = TRUE)
dfm_select removed 3,926 features in 0 documents, padding 0s for 0 features and 0 documents.
#100 least frequent terms
topfeatures(dfm.m, n = 100, decreasing = FALSE)
       berlintokyo      angloamerican        glasborough sovietczechoslovak               nang 
                 1                  1                  1                  1                  1 
   imperialistisra              laird       americanisra      rogersgromyko         sovietwest 
                 1                  1                  1                  1                  1 
       revengeseek               hich            redivid             xnajor    marxistleninist 
                 1                  1                  1                  1                  1 
       noneuropean           bautista            alberdi              wnidi            vietmam 
                 1                  1                  1                  1                  1 
            snouid       antihitlerit               sqon          nonapplic              gbout 
                 1                  1                  1                  1                  1 
   antiimperialist       pmrticiputlc          largescal           watermil               iust 
                 1                  1                  1                  1                  1 
         clepsydra            materia            uncouth            ipresid             trario 
                 1                  1                  1                  1                  1 
             fella            mildest             misael      aggiornamento         anglosaxon 
                 1                  1                  1                  1                  1 
             ttier            midsumm             perfor              khiem             samdec 
                 1                  1                  1                  1                  1 
        antikorean        phoenixvill       africanasian    americanzionist          noncombat 
                 1                  1                  1                  1                  1 
     briandkellogg           goodrich               jian               dubo             regenc 
                 1                  1                  1                  1                  1 
             perma               nent        montecatini              ibidj            plywood 
                 1                  1                  1                  1                  1 
              sime            ilswllf              komba              preci           peterson 
                 1                  1                  1                  1                  1 
        welldeserv      latinamerican      quaisonsackey             apeopl           dumardai 
                 1                  1                  1                  1                  1 
           auprinc       radhakrishna            scheldt    zionistamerican          intraarab 
                 1                  1                  1                  1                  1 
         henpresid     sovietegyptian             stowel              tarah              eilat 
                 1                  1                  1                  1                  1 
         antisemit               thew            bolzano        nationalrat           trentino 
                 1                  1                  1                  1                  1 
           giusepp            saragat               tbid         powergener   antinorthvietnam 
                 1                  1                  1                  1                  1 
          iifitlim        millipitfnn           vviuiuui          uuiiuyiug              aiula 
                 1                  1                  1                  1                  1 
            uaiiei             iigjjg           annexion           embitter           mountabl 
                 1                  1                  1                  1                  1 
dfm.w <- dfm_weight(dfm.trim, type = "tfidf")

Analysis

Wordscore based positions

One possiblity to assess positions of EU member states with text data is to use Wordscore – a methodology familiar to political scientists. Here we applying it to UNGD speeches to calculate measures of polarization in the UN on a dimension structured by the main (?) conflictual dimension of international politics – USA vs Russia.

One alternative would be to assess member states’ positions on another dimension of competition – USA vs China. This is more a trial as China-USA dimension may not be salient enough to structure foreign policy preferences of EU member states. At least not salient for now (?), but we should see convergence around 1989/1990.

We can look at standard deviation of EU positions on these two dimensions. The hypothesis is that there’s increasing convergence (lower variation) between EU member states as a result of socialization.

#Logicals for EU member states
EU <- c("BEL", "FRA", "DEU", "ITA", "LUX", "NLD")
rusa <- rusa %>% mutate(is.eu = Country %in% EU)
#first wave
rusa$is.eu[rusa$Country== "DNK" & rusa$Year >1972] <- TRUE
rusa$is.eu[rusa$Country== "IRL" & rusa$Year >1972] <- TRUE
rusa$is.eu[rusa$Country== "GBR" & rusa$Year >1972] <- TRUE
#second wave
rusa$is.eu[rusa$Country== "GRC" & rusa$Year >1980] <- TRUE
#third wave
rusa$is.eu[rusa$Country== "ESP" & rusa$Year >1985] <- TRUE
rusa$is.eu[rusa$Country== "PRT" & rusa$Year >1985] <- TRUE
#fourth wave
rusa$is.eu[rusa$Country== "AUT" & rusa$Year >1994] <- TRUE
rusa$is.eu[rusa$Country== "FIN" & rusa$Year >1994] <- TRUE
rusa$is.eu[rusa$Country== "SWE" & rusa$Year >1994] <- TRUE
#fifth wave
rusa$is.eu[rusa$Country== "CZE" & rusa$Year >2003] <- TRUE
rusa$is.eu[rusa$Country== "HUN" & rusa$Year >2003] <- TRUE
rusa$is.eu[rusa$Country== "POL" & rusa$Year >2003] <- TRUE
rusa$is.eu[rusa$Country== "EST" & rusa$Year >2003] <- TRUE
rusa$is.eu[rusa$Country== "LVA" & rusa$Year >2003] <- TRUE
rusa$is.eu[rusa$Country== "LTU" & rusa$Year >2003] <- TRUE
rusa$is.eu[rusa$Country== "CYP" & rusa$Year >2003] <- TRUE
rusa$is.eu[rusa$Country== "MLT" & rusa$Year >2003] <- TRUE
rusa$is.eu[rusa$Country== "SVK" & rusa$Year >2003] <- TRUE
rusa$is.eu[rusa$Country== "SVN" & rusa$Year >2003] <- TRUE
#sixth wave
rusa$is.eu[rusa$Country== "BGR" & rusa$Year >2006] <- TRUE
rusa$is.eu[rusa$Country== "ROU" & rusa$Year >2006] <- TRUE
#seventh wave
rusa$is.eu[rusa$Country== "HRV" & rusa$Year >2012] <- TRUE
#The same for the China-US dimension:
chnusa <- chnusa %>% mutate(is.eu = Country %in% EU)
#first wave
chnusa$is.eu[chnusa$Country== "DNK" & chnusa$Year >1972] <- TRUE
chnusa$is.eu[chnusa$Country== "IRL" & chnusa$Year >1972] <- TRUE
chnusa$is.eu[chnusa$Country== "GBR" & chnusa$Year >1972] <- TRUE
#second wave
chnusa$is.eu[chnusa$Country== "GRC" & chnusa$Year >1980] <- TRUE
#third wave
chnusa$is.eu[chnusa$Country== "ESP" & chnusa$Year >1985] <- TRUE
chnusa$is.eu[chnusa$Country== "PRT" & chnusa$Year >1985] <- TRUE
#fourth wave
chnusa$is.eu[chnusa$Country== "AUT" & chnusa$Year >1994] <- TRUE
chnusa$is.eu[chnusa$Country== "FIN" & chnusa$Year >1994] <- TRUE
chnusa$is.eu[chnusa$Country== "SWE" & chnusa$Year >1994] <- TRUE
#fifth wave
chnusa$is.eu[chnusa$Country== "CZE" & chnusa$Year >2003] <- TRUE
chnusa$is.eu[chnusa$Country== "HUN" & chnusa$Year >2003] <- TRUE
chnusa$is.eu[chnusa$Country== "POL" & chnusa$Year >2003] <- TRUE
chnusa$is.eu[chnusa$Country== "EST" & chnusa$Year >2003] <- TRUE
chnusa$is.eu[chnusa$Country== "LVA" & chnusa$Year >2003] <- TRUE
chnusa$is.eu[chnusa$Country== "LTU" & chnusa$Year >2003] <- TRUE
chnusa$is.eu[chnusa$Country== "CYP" & chnusa$Year >2003] <- TRUE
chnusa$is.eu[chnusa$Country== "MLT" & chnusa$Year >2003] <- TRUE
chnusa$is.eu[chnusa$Country== "SVK" & chnusa$Year >2003] <- TRUE
chnusa$is.eu[chnusa$Country== "SVN" & chnusa$Year >2003] <- TRUE
#sixth wave
chnusa$is.eu[chnusa$Country== "BGR" & chnusa$Year >2006] <- TRUE
chnusa$is.eu[chnusa$Country== "ROU" & chnusa$Year >2006] <- TRUE
#seventh wave
chnusa$is.eu[chnusa$Country== "HRV" & chnusa$Year >2012] <- TRUE
derus <- derus %>% mutate(is.eu = Country %in% EU)
#first wave
derus$is.eu[derus$Country== "DNK" & derus$Year >1972] <- TRUE
derus$is.eu[derus$Country== "IRL" & derus$Year >1972] <- TRUE
derus$is.eu[derus$Country== "GBR" & derus$Year >1972] <- TRUE
#second wave
derus$is.eu[derus$Country== "GRC" & derus$Year >1980] <- TRUE
#third wave
derus$is.eu[derus$Country== "ESP" & derus$Year >1985] <- TRUE
derus$is.eu[derus$Country== "PRT" & derus$Year >1985] <- TRUE
#fourth wave
derus$is.eu[derus$Country== "AUT" & derus$Year >1994] <- TRUE
derus$is.eu[derus$Country== "FIN" & derus$Year >1994] <- TRUE
derus$is.eu[derus$Country== "SWE" & derus$Year >1994] <- TRUE
#fifth wave
derus$is.eu[derus$Country== "CZE" & derus$Year >2003] <- TRUE
derus$is.eu[derus$Country== "HUN" & derus$Year >2003] <- TRUE
derus$is.eu[derus$Country== "POL" & derus$Year >2003] <- TRUE
derus$is.eu[derus$Country== "EST" & derus$Year >2003] <- TRUE
derus$is.eu[derus$Country== "LVA" & derus$Year >2003] <- TRUE
derus$is.eu[derus$Country== "LTU" & derus$Year >2003] <- TRUE
derus$is.eu[derus$Country== "CYP" & derus$Year >2003] <- TRUE
derus$is.eu[derus$Country== "MLT" & derus$Year >2003] <- TRUE
derus$is.eu[derus$Country== "SVK" & derus$Year >2003] <- TRUE
derus$is.eu[derus$Country== "SVN" & derus$Year >2003] <- TRUE
#sixth wave
derus$is.eu[derus$Country== "BGR" & derus$Year >2006] <- TRUE
derus$is.eu[derus$Country== "ROU" & derus$Year >2006] <- TRUE
#seventh wave
derus$is.eu[derus$Country== "HRV" & derus$Year >2012] <- TRUE
deusa <- deusa %>% mutate(is.eu = Country %in% EU)
#first wave
deusa$is.eu[deusa$Country== "DNK" & deusa$Year >1972] <- TRUE
deusa$is.eu[deusa$Country== "IRL" & deusa$Year >1972] <- TRUE
deusa$is.eu[deusa$Country== "GBR" & deusa$Year >1972] <- TRUE
#second wave
deusa$is.eu[deusa$Country== "GRC" & deusa$Year >1980] <- TRUE
#third wave
deusa$is.eu[deusa$Country== "ESP" & deusa$Year >1985] <- TRUE
deusa$is.eu[deusa$Country== "PRT" & deusa$Year >1985] <- TRUE
#fourth wave
deusa$is.eu[deusa$Country== "AUT" & deusa$Year >1994] <- TRUE
deusa$is.eu[deusa$Country== "FIN" & deusa$Year >1994] <- TRUE
deusa$is.eu[deusa$Country== "SWE" & deusa$Year >1994] <- TRUE
#fifth wave
deusa$is.eu[deusa$Country== "CZE" & deusa$Year >2003] <- TRUE
deusa$is.eu[deusa$Country== "HUN" & deusa$Year >2003] <- TRUE
deusa$is.eu[deusa$Country== "POL" & deusa$Year >2003] <- TRUE
deusa$is.eu[deusa$Country== "EST" & deusa$Year >2003] <- TRUE
deusa$is.eu[deusa$Country== "LVA" & deusa$Year >2003] <- TRUE
deusa$is.eu[deusa$Country== "LTU" & deusa$Year >2003] <- TRUE
deusa$is.eu[deusa$Country== "CYP" & deusa$Year >2003] <- TRUE
deusa$is.eu[deusa$Country== "MLT" & deusa$Year >2003] <- TRUE
deusa$is.eu[deusa$Country== "SVK" & deusa$Year >2003] <- TRUE
deusa$is.eu[deusa$Country== "SVN" & deusa$Year >2003] <- TRUE
#sixth wave
deusa$is.eu[deusa$Country== "BGR" & deusa$Year >2006] <- TRUE
deusa$is.eu[deusa$Country== "ROU" & deusa$Year >2006] <- TRUE
#seventh wave
deusa$is.eu[deusa$Country== "HRV" & deusa$Year >2012] <- TRUE
luxerus <- luxerus %>% mutate(is.eu = Country %in% EU)
#first wave
luxerus$is.eu[luxerus$Country== "DNK" & luxerus$Year >1972] <- TRUE
luxerus$is.eu[luxerus$Country== "IRL" & luxerus$Year >1972] <- TRUE
luxerus$is.eu[luxerus$Country== "GBR" & luxerus$Year >1972] <- TRUE
#second wave
luxerus$is.eu[luxerus$Country== "GRC" & luxerus$Year >1980] <- TRUE
#third wave
luxerus$is.eu[luxerus$Country== "ESP" & luxerus$Year >1985] <- TRUE
luxerus$is.eu[luxerus$Country== "PRT" & luxerus$Year >1985] <- TRUE
#fourth wave
luxerus$is.eu[luxerus$Country== "AUT" & luxerus$Year >1994] <- TRUE
luxerus$is.eu[luxerus$Country== "FIN" & luxerus$Year >1994] <- TRUE
luxerus$is.eu[luxerus$Country== "SWE" & luxerus$Year >1994] <- TRUE
#fifth wave
luxerus$is.eu[luxerus$Country== "CZE" & luxerus$Year >2003] <- TRUE
luxerus$is.eu[luxerus$Country== "HUN" & luxerus$Year >2003] <- TRUE
luxerus$is.eu[luxerus$Country== "POL" & luxerus$Year >2003] <- TRUE
luxerus$is.eu[luxerus$Country== "EST" & luxerus$Year >2003] <- TRUE
luxerus$is.eu[luxerus$Country== "LVA" & luxerus$Year >2003] <- TRUE
luxerus$is.eu[luxerus$Country== "LTU" & luxerus$Year >2003] <- TRUE
luxerus$is.eu[luxerus$Country== "CYP" & luxerus$Year >2003] <- TRUE
luxerus$is.eu[luxerus$Country== "MLT" & luxerus$Year >2003] <- TRUE
luxerus$is.eu[luxerus$Country== "SVK" & luxerus$Year >2003] <- TRUE
luxerus$is.eu[luxerus$Country== "SVN" & luxerus$Year >2003] <- TRUE
#sixth wave
luxerus$is.eu[luxerus$Country== "BGR" & luxerus$Year >2006] <- TRUE
luxerus$is.eu[luxerus$Country== "ROU" & luxerus$Year >2006] <- TRUE
#seventh wave
luxerus$is.eu[luxerus$Country== "HRV" & luxerus$Year >2012] <- TRUE
luxus <- luxus %>% mutate(is.eu = Country %in% EU)
#first wave
luxus$is.eu[luxus$Country== "DNK" & luxus$Year >1972] <- TRUE
luxus$is.eu[luxus$Country== "IRL" & luxus$Year >1972] <- TRUE
luxus$is.eu[luxus$Country== "GBR" & luxus$Year >1972] <- TRUE
#second wave
luxus$is.eu[luxus$Country== "GRC" & luxus$Year >1980] <- TRUE
#third wave
luxus$is.eu[luxus$Country== "ESP" & luxus$Year >1985] <- TRUE
luxus$is.eu[luxus$Country== "PRT" & luxus$Year >1985] <- TRUE
#fourth wave
luxus$is.eu[luxus$Country== "AUT" & luxus$Year >1994] <- TRUE
luxus$is.eu[luxus$Country== "FIN" & luxus$Year >1994] <- TRUE
luxus$is.eu[luxus$Country== "SWE" & luxus$Year >1994] <- TRUE
#fifth wave
luxus$is.eu[luxus$Country== "CZE" & luxus$Year >2003] <- TRUE
luxus$is.eu[luxus$Country== "HUN" & luxus$Year >2003] <- TRUE
luxus$is.eu[luxus$Country== "POL" & luxus$Year >2003] <- TRUE
luxus$is.eu[luxus$Country== "EST" & luxus$Year >2003] <- TRUE
luxus$is.eu[luxus$Country== "LVA" & luxus$Year >2003] <- TRUE
luxus$is.eu[luxus$Country== "LTU" & luxus$Year >2003] <- TRUE
luxus$is.eu[luxus$Country== "CYP" & luxus$Year >2003] <- TRUE
luxus$is.eu[luxus$Country== "MLT" & luxus$Year >2003] <- TRUE
luxus$is.eu[luxus$Country== "SVK" & luxus$Year >2003] <- TRUE
luxus$is.eu[luxus$Country== "SVN" & luxus$Year >2003] <- TRUE
#sixth wave
luxus$is.eu[luxus$Country== "BGR" & luxus$Year >2006] <- TRUE
luxus$is.eu[luxus$Country== "ROU" & luxus$Year >2006] <- TRUE
#seventh wave
luxus$is.eu[luxus$Country== "HRV" & luxus$Year >2012] <- TRUE
pal <- pal %>% mutate(is.eu = Country %in% EU)
#first wave
pal$is.eu[pal$Country== "DNK" & pal$Year >1972] <- TRUE
pal$is.eu[pal$Country== "IRL" & pal$Year >1972] <- TRUE
pal$is.eu[pal$Country== "GBR" & pal$Year >1972] <- TRUE
#second wave
pal$is.eu[pal$Country== "GRC" & pal$Year >1980] <- TRUE
#third wave
pal$is.eu[pal$Country== "ESP" & pal$Year >1985] <- TRUE
pal$is.eu[pal$Country== "PRT" & pal$Year >1985] <- TRUE
#fourth wave
pal$is.eu[pal$Country== "AUT" & pal$Year >1994] <- TRUE
pal$is.eu[pal$Country== "FIN" & pal$Year >1994] <- TRUE
pal$is.eu[pal$Country== "SWE" & pal$Year >1994] <- TRUE
#fifth wave
pal$is.eu[pal$Country== "CZE" & pal$Year >2003] <- TRUE
pal$is.eu[pal$Country== "HUN" & pal$Year >2003] <- TRUE
pal$is.eu[pal$Country== "POL" & pal$Year >2003] <- TRUE
pal$is.eu[pal$Country== "EST" & pal$Year >2003] <- TRUE
pal$is.eu[pal$Country== "LVA" & pal$Year >2003] <- TRUE
pal$is.eu[pal$Country== "LTU" & pal$Year >2003] <- TRUE
pal$is.eu[pal$Country== "CYP" & pal$Year >2003] <- TRUE
pal$is.eu[pal$Country== "MLT" & pal$Year >2003] <- TRUE
pal$is.eu[pal$Country== "SVK" & pal$Year >2003] <- TRUE
pal$is.eu[pal$Country== "SVN" & pal$Year >2003] <- TRUE
#sixth wave
pal$is.eu[pal$Country== "BGR" & pal$Year >2006] <- TRUE
pal$is.eu[pal$Country== "ROU" & pal$Year >2006] <- TRUE
#seventh wave
pal$is.eu[pal$Country== "HRV" & pal$Year >2012] <- TRUE
presus <- presus %>% mutate(is.eu = Country %in% EU)
#first wave
presus$is.eu[presus$Country== "DNK" & presus$Year >1972] <- TRUE
presus$is.eu[presus$Country== "IRL" & presus$Year >1972] <- TRUE
presus$is.eu[presus$Country== "GBR" & presus$Year >1972] <- TRUE
#second wave
presus$is.eu[presus$Country== "GRC" & presus$Year >1980] <- TRUE
#third wave
presus$is.eu[presus$Country== "ESP" & presus$Year >1985] <- TRUE
presus$is.eu[presus$Country== "PRT" & presus$Year >1985] <- TRUE
#fourth wave
presus$is.eu[presus$Country== "AUT" & presus$Year >1994] <- TRUE
presus$is.eu[presus$Country== "FIN" & presus$Year >1994] <- TRUE
presus$is.eu[presus$Country== "SWE" & presus$Year >1994] <- TRUE
#fifth wave
presus$is.eu[presus$Country== "CZE" & presus$Year >2003] <- TRUE
presus$is.eu[presus$Country== "HUN" & presus$Year >2003] <- TRUE
presus$is.eu[presus$Country== "POL" & presus$Year >2003] <- TRUE
presus$is.eu[presus$Country== "EST" & presus$Year >2003] <- TRUE
presus$is.eu[presus$Country== "LVA" & presus$Year >2003] <- TRUE
presus$is.eu[presus$Country== "LTU" & presus$Year >2003] <- TRUE
presus$is.eu[presus$Country== "CYP" & presus$Year >2003] <- TRUE
presus$is.eu[presus$Country== "MLT" & presus$Year >2003] <- TRUE
presus$is.eu[presus$Country== "SVK" & presus$Year >2003] <- TRUE
presus$is.eu[presus$Country== "SVN" & presus$Year >2003] <- TRUE
#sixth wave
presus$is.eu[presus$Country== "BGR" & presus$Year >2006] <- TRUE
presus$is.eu[presus$Country== "ROU" & presus$Year >2006] <- TRUE
#seventh wave
presus$is.eu[presus$Country== "HRV" & presus$Year >2012] <- TRUE
presusalt <- presusalt %>% mutate(is.eu = Country %in% EU)
#first wave
presusalt$is.eu[presusalt$Country== "DNK" & presusalt$Year >1972] <- TRUE
presusalt$is.eu[presusalt$Country== "IRL" & presusalt$Year >1972] <- TRUE
presusalt$is.eu[presusalt$Country== "GBR" & presusalt$Year >1972] <- TRUE
#second wave
presusalt$is.eu[presusalt$Country== "GRC" & presusalt$Year >1980] <- TRUE
#third wave
presusalt$is.eu[presusalt$Country== "ESP" & presusalt$Year >1985] <- TRUE
presusalt$is.eu[presusalt$Country== "PRT" & presusalt$Year >1985] <- TRUE
#fourth wave
presusalt$is.eu[presusalt$Country== "AUT" & presusalt$Year >1994] <- TRUE
presusalt$is.eu[presusalt$Country== "FIN" & presusalt$Year >1994] <- TRUE
presusalt$is.eu[presusalt$Country== "SWE" & presusalt$Year >1994] <- TRUE
#fifth wave
presusalt$is.eu[presusalt$Country== "CZE" & presusalt$Year >2003] <- TRUE
presusalt$is.eu[presusalt$Country== "HUN" & presusalt$Year >2003] <- TRUE
presusalt$is.eu[presusalt$Country== "POL" & presusalt$Year >2003] <- TRUE
presusalt$is.eu[presusalt$Country== "EST" & presusalt$Year >2003] <- TRUE
presusalt$is.eu[presusalt$Country== "LVA" & presusalt$Year >2003] <- TRUE
presusalt$is.eu[presusalt$Country== "LTU" & presusalt$Year >2003] <- TRUE
presusalt$is.eu[presusalt$Country== "CYP" & presusalt$Year >2003] <- TRUE
presusalt$is.eu[presusalt$Country== "MLT" & presusalt$Year >2003] <- TRUE
presusalt$is.eu[presusalt$Country== "SVK" & presusalt$Year >2003] <- TRUE
presusalt$is.eu[presusalt$Country== "SVN" & presusalt$Year >2003] <- TRUE
#sixth wave
presusalt$is.eu[presusalt$Country== "BGR" & presusalt$Year >2006] <- TRUE
presusalt$is.eu[presusalt$Country== "ROU" & presusalt$Year >2006] <- TRUE
#seventh wave
presusalt$is.eu[presusalt$Country== "HRV" & presusalt$Year >2012] <- TRUE
presrus <- presrus %>% mutate(is.eu = Country %in% EU)
#first wave
presrus$is.eu[presrus$Country== "DNK" & presrus$Year >1972] <- TRUE
presrus$is.eu[presrus$Country== "IRL" & presrus$Year >1972] <- TRUE
presrus$is.eu[presrus$Country== "GBR" & presrus$Year >1972] <- TRUE
#second wave
presrus$is.eu[presrus$Country== "GRC" & presrus$Year >1980] <- TRUE
#third wave
presrus$is.eu[presrus$Country== "ESP" & presrus$Year >1985] <- TRUE
presrus$is.eu[presrus$Country== "PRT" & presrus$Year >1985] <- TRUE
#fourth wave
presrus$is.eu[presrus$Country== "AUT" & presrus$Year >1994] <- TRUE
presrus$is.eu[presrus$Country== "FIN" & presrus$Year >1994] <- TRUE
presrus$is.eu[presrus$Country== "SWE" & presrus$Year >1994] <- TRUE
#fifth wave
presrus$is.eu[presrus$Country== "CZE" & presrus$Year >2003] <- TRUE
presrus$is.eu[presrus$Country== "HUN" & presrus$Year >2003] <- TRUE
presrus$is.eu[presrus$Country== "POL" & presrus$Year >2003] <- TRUE
presrus$is.eu[presrus$Country== "EST" & presrus$Year >2003] <- TRUE
presrus$is.eu[presrus$Country== "LVA" & presrus$Year >2003] <- TRUE
presrus$is.eu[presrus$Country== "LTU" & presrus$Year >2003] <- TRUE
presrus$is.eu[presrus$Country== "CYP" & presrus$Year >2003] <- TRUE
presrus$is.eu[presrus$Country== "MLT" & presrus$Year >2003] <- TRUE
presrus$is.eu[presrus$Country== "SVK" & presrus$Year >2003] <- TRUE
presrus$is.eu[presrus$Country== "SVN" & presrus$Year >2003] <- TRUE
#sixth wave
presrus$is.eu[presrus$Country== "BGR" & presrus$Year >2006] <- TRUE
presrus$is.eu[presrus$Country== "ROU" & presrus$Year >2006] <- TRUE
#seventh wave
presrus$is.eu[presrus$Country== "HRV" & presrus$Year >2012] <- TRUE
presrusalt <- presrusalt %>% mutate(is.eu = Country %in% EU)
#first wave
presrusalt$is.eu[presrusalt$Country== "DNK" & presrusalt$Year >1972] <- TRUE
presrusalt$is.eu[presrusalt$Country== "IRL" & presrusalt$Year >1972] <- TRUE
presrusalt$is.eu[presrusalt$Country== "GBR" & presrusalt$Year >1972] <- TRUE
#second wave
presrusalt$is.eu[presrusalt$Country== "GRC" & presrusalt$Year >1980] <- TRUE
#third wave
presrusalt$is.eu[presrusalt$Country== "ESP" & presrusalt$Year >1985] <- TRUE
presrusalt$is.eu[presrusalt$Country== "PRT" & presrusalt$Year >1985] <- TRUE
#fourth wave
presrusalt$is.eu[presrusalt$Country== "AUT" & presrusalt$Year >1994] <- TRUE
presrusalt$is.eu[presrusalt$Country== "FIN" & presrusalt$Year >1994] <- TRUE
presrusalt$is.eu[presrusalt$Country== "SWE" & presrusalt$Year >1994] <- TRUE
#fifth wave
presrusalt$is.eu[presrusalt$Country== "CZE" & presrusalt$Year >2003] <- TRUE
presrusalt$is.eu[presrusalt$Country== "HUN" & presrusalt$Year >2003] <- TRUE
presrusalt$is.eu[presrusalt$Country== "POL" & presrusalt$Year >2003] <- TRUE
presrusalt$is.eu[presrusalt$Country== "EST" & presrusalt$Year >2003] <- TRUE
presrusalt$is.eu[presrusalt$Country== "LVA" & presrusalt$Year >2003] <- TRUE
presrusalt$is.eu[presrusalt$Country== "LTU" & presrusalt$Year >2003] <- TRUE
presrusalt$is.eu[presrusalt$Country== "CYP" & presrusalt$Year >2003] <- TRUE
presrusalt$is.eu[presrusalt$Country== "MLT" & presrusalt$Year >2003] <- TRUE
presrusalt$is.eu[presrusalt$Country== "SVK" & presrusalt$Year >2003] <- TRUE
presrusalt$is.eu[presrusalt$Country== "SVN" & presrusalt$Year >2003] <- TRUE
#sixth wave
presrusalt$is.eu[presrusalt$Country== "BGR" & presrusalt$Year >2006] <- TRUE
presrusalt$is.eu[presrusalt$Country== "ROU" & presrusalt$Year >2006] <- TRUE
#seventh wave
presrusalt$is.eu[presrusalt$Country== "HRV" & presrusalt$Year >2012] <- TRUE

Calculating average scores and standard deviations for EU member states.

eu_rusa <- summarise(group_by(filter(rusa, is.eu==TRUE), Year), 
                      score_rusa = mean(wscore), sd_rusa = sd(wscore))
eu_chnusa <- summarise(group_by(filter(chnusa, is.eu==TRUE), Year), 
                      score_chn = mean(wscore), sd_chn = sd(wscore))
eu_derus <- summarise(group_by(filter(derus, is.eu==TRUE), Year), 
                      score_derus = mean(wscore), sd_derus = sd(wscore))
eu_deusa <- summarise(group_by(filter(deusa, is.eu==TRUE), Year), 
                      score_deusa = mean(wscore), sd_deusa = sd(wscore))
eu_luxerus <- summarise(group_by(filter(luxerus, is.eu==TRUE), Year), 
                      score_luxerus = mean(wscore), sd_luxerus = sd(wscore))
eu_luxus <- summarise(group_by(filter(luxus, is.eu==TRUE), Year), 
                      score_luxus = mean(wscore), sd_luxus = sd(wscore))
eu_pal <- summarise(group_by(filter(pal, is.eu==TRUE), Year), 
                      score_pal = mean(wscore), sd_pal = sd(wscore))
eu_presus <- summarise(group_by(filter(presus, is.eu==TRUE), Year), 
                      score_presus = mean(wscore), sd_presus = sd(wscore))
eu_presusalt <- summarise(group_by(filter(presusalt, is.eu==TRUE), Year), 
                      score_presusalt = mean(wscore), sd_presusalt = sd(wscore))
eu_presrus <- summarise(group_by(filter(presrus, is.eu==TRUE), Year), 
                      score_presrus = mean(wscore), sd_presrus = sd(wscore))
eu_presrusalt <- summarise(group_by(filter(presrusalt, is.eu==TRUE), Year), 
                      score_presrusalt = mean(wscore), sd_presrusalt = sd(wscore))
eu_scores <- left_join(eu_rusa, eu_chnusa, by="Year" )
eu_scores <- left_join(eu_scores, eu_derus, by="Year" )
eu_scores <- left_join(eu_scores, eu_deusa, by="Year" )
eu_scores <- left_join(eu_scores, eu_luxerus, by="Year" )
eu_scores <- left_join(eu_scores, eu_luxus, by="Year" )
eu_scores <- left_join(eu_scores, eu_pal, by="Year" )
eu_scores <- left_join(eu_scores, eu_presus, by="Year" )
eu_scores <- left_join(eu_scores, eu_presusalt, by="Year" )
eu_scores <- left_join(eu_scores, eu_presrus, by="Year" )
eu_scores <- left_join(eu_scores, eu_presrusalt, by="Year" )

Plots with wordscore results

Averages

#Plot of average scores
ggplot(data = eu_scores) +
  geom_point(aes(x=Year, y=score_rusa), na.rm = TRUE, colour = "blue") + 
  geom_smooth(aes(x=Year, y=score_rusa), colour = "blue", se = FALSE) +
  ylab("Average EU score") +
  ggtitle("USA (+1) - Russia (-1) dimension") +
  theme_bw()
ggsave("avscoreRUSA.pdf")
Saving 7.29 x 4.51 in image

#Plot of average scores
ggplot(data = eu_scores) +
  geom_point(aes(x=Year, y=score_chn), na.rm = TRUE, colour = "blue") + 
  geom_smooth(aes(x=Year, y=score_chn), colour = "blue", se = FALSE) +
  ylab("Average wordscore for EU") +
  ggtitle("USA (+1) - China (-1) dimension") +
  theme_bw()
ggsave("avscoreCHN.pdf")
Saving 6.5 x 4.02 in image

#Plot of average scores
ggplot(data = eu_scores) +
  geom_point(aes(x=Year, y=score_derus), na.rm = TRUE, colour = "blue") + 
  geom_smooth(aes(x=Year, y=score_derus), colour = "blue", se = FALSE) +
  ylab("Average wordscore for EU") +
  ggtitle("DEU (+1) - RUS (-1) dimension") +
  theme_bw()
ggsave("avscoreDERUS.pdf")
Saving 6.5 x 4.02 in image

#Plot of average scores
ggplot(data = eu_scores) +
  geom_point(aes(x=Year, y=score_deusa), na.rm = TRUE, colour = "blue") + 
  geom_smooth(aes(x=Year, y=score_deusa), colour = "blue", se = FALSE) +
  ylab("Average wordscore for EU") +
  ggtitle("USA (+1) - DEU (-1) dimension") +
  theme_bw()
ggsave("avscoreDEUSA.pdf")
Saving 6.5 x 4.02 in image

#Plot of average scores
ggplot(data = eu_scores) +
  geom_point(aes(x=Year, y=score_luxerus), na.rm = TRUE, colour = "blue") + 
  geom_smooth(aes(x=Year, y=score_luxerus), colour = "blue", se = FALSE) +
  ylab("Average wordscore for EU") +
  ggtitle("LUX (+1) - RUS (-1) dimension") +
  theme_bw()
ggsave("avscoreLUXERUS.pdf")
Saving 6.5 x 4.02 in image

#Plot of average scores
ggplot(data = eu_scores) +
  geom_point(aes(x=Year, y=score_luxus), na.rm = TRUE, colour = "blue") + 
  geom_smooth(aes(x=Year, y=score_luxus), colour = "blue", se = FALSE) +
  ylab("Average wordscore for EU") +
  ggtitle("USA (+1) - LUX (-1) dimension") +
  theme_bw()
ggsave("avscoreLUXUS.pdf")
Saving 6.5 x 4.02 in image

#Plot of average scores
ggplot(data = subset(eu_scores, Year>1997)) +
  geom_point(aes(x=Year, y=score_pal), na.rm = TRUE, colour = "blue") + 
  geom_smooth(aes(x=Year, y=score_pal), colour = "blue", se = FALSE) +
  ylab("Average wordscore for EU") +
  ggtitle("ISR (+1) - PSE (-1) dimension") +
  theme_bw()
ggsave("avscorePAL.pdf")
Saving 6.5 x 4.02 in image

#Plot of average scores
ggplot(data = eu_scores) +
  geom_point(aes(x=Year, y=score_presus), na.rm = TRUE, colour = "blue") + 
  geom_smooth(aes(x=Year, y=score_presus), colour = "blue", se = FALSE) +
  ylab("Average wordscore for EU") +
  ggtitle("USA (+1) - Presidency (-1) dimension") +
  theme_bw()
ggsave("avscorePRESUS.pdf")
Saving 6.5 x 4.02 in image

#Plot of average scores
ggplot(data = eu_scores) +
  geom_point(aes(x=Year, y=score_presusalt), na.rm = TRUE, colour = "blue") + 
  geom_smooth(aes(x=Year, y=score_presusalt), colour = "blue", se = FALSE) +
  ylab("Average wordscore for EU") +
  ggtitle("USA (+1) - PresidencyALT (-1) dimension") +
  theme_bw()
ggsave("avscorePRESUSalt.pdf")
Saving 6.5 x 4.02 in image

#Plot of average scores
ggplot(data = eu_scores) +
  geom_point(aes(x=Year, y=score_presrus), na.rm = TRUE, colour = "blue") + 
  geom_smooth(aes(x=Year, y=score_presrus), colour = "blue", se = FALSE) +
  ylab("Average wordscore for EU") +
  ggtitle("Presidency (+1) - RUS (-1) dimension") +
  theme_bw()
ggsave("avscorePRESRUS.pdf")
Saving 6.5 x 4.02 in image

#Plot of average scores
ggplot(data = eu_scores) +
  geom_point(aes(x=Year, y=score_presrusalt), na.rm = TRUE, colour = "blue") + 
  geom_smooth(aes(x=Year, y=score_presrusalt), colour = "blue", se = FALSE) +
  ylab("Average wordscore for EU") +
  ggtitle("PresidencyALT (+1) - RUS (-1) dimension") +
  theme_bw()
ggsave("avscorePRESRUSalt.pdf")
Saving 6.5 x 4.02 in image

Standard deviations

#Plot of sd scores
ggplot(data = eu_scores) +
  geom_point(aes(x=Year, y=sd_rusa), na.rm = TRUE, colour = "blue") + 
  geom_smooth(aes(x=Year, y=sd_rusa), colour = "blue", se = FALSE) +
  ylab("Standard deviation of wordscores for EU") +
  ggtitle("USA (+1) - Russia (-1) dimension") +
  theme_bw()
ggsave("sdscoreRUSA.pdf")
Saving 7.29 x 4.51 in image

#Plot of sd scores
ggplot(data = eu_scores) +
  geom_point(aes(x=Year, y=sd_chn), na.rm = TRUE, colour = "blue") + 
  geom_smooth(aes(x=Year, y=sd_chn), colour = "blue", se = FALSE) +
  ylab("Standard deviation of wordscores for EU") +
  ggtitle("USA (+1) - China (-1) dimension") +
  theme_bw()
ggsave("sdscoreCHN.pdf")
Saving 6.5 x 4.02 in image

#Plot of sd scores
ggplot(data = eu_scores) +
  geom_point(aes(x=Year, y=sd_derus), na.rm = TRUE, colour = "blue") + 
  geom_smooth(aes(x=Year, y=sd_derus), colour = "blue", se = FALSE) +
  ylab("Standard deviation of wordscores for EU") +
  ggtitle("DEU (+1) - RUS (-1) dimension") +
  theme_bw()
ggsave("sdscoreDERUS.pdf")
Saving 6.5 x 4.02 in image

#Plot of sd scores
ggplot(data = eu_scores) +
  geom_point(aes(x=Year, y=sd_deusa), na.rm = TRUE, colour = "blue") + 
  geom_smooth(aes(x=Year, y=sd_deusa), colour = "blue", se = FALSE) +
  ylab("Standard deviation of wordscores for EU") +
  ggtitle("USA (+1) - DEU (-1) dimension") +
  theme_bw()
ggsave("sdscoreDEUSA.pdf")
Saving 6.5 x 4.02 in image

#Plot of sd scores
ggplot(data = eu_scores) +
  geom_point(aes(x=Year, y=sd_luxerus), na.rm = TRUE, colour = "blue") + 
  geom_smooth(aes(x=Year, y=sd_luxerus), colour = "blue", se = FALSE) +
  ylab("Standard deviation of wordscores for EU") +
  ggtitle("LUX (+1) - RUS (-1) dimension") +
  theme_bw()
ggsave("sdscoreLUXERUS.pdf")
Saving 6.5 x 4.02 in image

#Plot of sd scores
ggplot(data = eu_scores) +
  geom_point(aes(x=Year, y=sd_luxus), na.rm = TRUE, colour = "blue") + 
  geom_smooth(aes(x=Year, y=sd_luxus), colour = "blue", se = FALSE) +
  ylab("Standard deviation of wordscores for EU") +
  ggtitle("USA (+1) - LUX (-1) dimension") +
  theme_bw()
ggsave("sdscoreLUXUS.pdf")
Saving 6.5 x 4.02 in image

#Plot of sd scores
ggplot(data = subset(eu_scores, Year>1997)) +
  geom_point(aes(x=Year, y=sd_pal), na.rm = TRUE, colour = "blue") + 
  geom_smooth(aes(x=Year, y=sd_pal), colour = "blue", se = FALSE) +
  ylab("Standard deviation of wordscores for EU") +
  ggtitle("ISR (+1) - PSE (-1) dimension") +
  theme_bw()
ggsave("sdscorePAL.pdf")
Saving 6.5 x 4.02 in image

#Plot of sd scores
ggplot(data = eu_scores) +
  geom_point(aes(x=Year, y=sd_presus), na.rm = TRUE, colour = "blue") + 
  geom_smooth(aes(x=Year, y=sd_presus), colour = "blue", se = FALSE) +
  ylab("Standard deviation of wordscores for EU") +
  ggtitle("USA (+1) - Presidency (-1) dimension") +
  theme_bw()
ggsave("sdscorePRESUS.pdf")
Saving 6.5 x 4.02 in image

#Plot of sd scores
ggplot(data = eu_scores) +
  geom_point(aes(x=Year, y=sd_presusalt), na.rm = TRUE, colour = "blue") + 
  geom_smooth(aes(x=Year, y=sd_presusalt), colour = "blue", se = FALSE) +
  ylab("Standard deviation of wordscores for EU") +
  ggtitle("USA (+1) - PresidencyALT (-1) dimension") +
  theme_bw()
ggsave("sdscorePRESUSalt.pdf")
Saving 6.5 x 4.02 in image

#Plot of sd scores
ggplot(data = eu_scores) +
  geom_point(aes(x=Year, y=sd_presrus), na.rm = TRUE, colour = "blue") + 
  geom_smooth(aes(x=Year, y=sd_presrus), colour = "blue", se = FALSE) +
  ylab("Standard deviation of wordscores for EU") +
  ggtitle("Presidency (+1) - RUS (-1) dimension") +
  theme_bw()
ggsave("sdscorePRESRUS.pdf")
Saving 6.5 x 4.02 in image

#Plot of sd scores
ggplot(data = eu_scores) +
  geom_point(aes(x=Year, y=sd_presrusalt), na.rm = TRUE, colour = "blue") + 
  geom_smooth(aes(x=Year, y=sd_presrusalt), colour = "blue", se = FALSE) +
  ylab("Standard deviation of wordscores for EU") +
  ggtitle("PresidencyALT (+1) - RUS (-1) dimension") +
  theme_bw()
ggsave("sdscorePRESRUSalt.pdf")
Saving 6.5 x 4.02 in image

Similarity based socialization

As a direct measure of convergence in foreign policy preferences we calculate similarity between each speech and the official EU policy as stated in speeches by the presiding EU member state, and, after 2007, the speech of EC president. In addition, we calculate similarity to the speech by Luxembourg which in our interviews came through as the country most in line with the EU line.

We use cosine similarity, running estimation by year: i.e. calculates similarity between each country and EU presidency/EC/LUX for each session separately.

Similarity with EU presidency

Similarity with EU presidency, but from 2011 similarity is calculated with EC

Combining all similarity estimates into one file

simil_estimates <- left_join(pres_similarity, pres_similarity_ec, by = c("Country", "Year"))
simil_estimates <- left_join(simil_estimates, LUX_similarity, by = c("Country", "Year"))

Plot of similarities for EU member states:

#Logicals for EU member states
simil_estimates <- simil_estimates %>% mutate(is.eu = Country %in% EU)
#first wave
simil_estimates$is.eu[simil_estimates$Country== "DNK" & simil_estimates$Year >1972] <- TRUE
simil_estimates$is.eu[simil_estimates$Country== "IRL" & simil_estimates$Year >1972] <- TRUE
simil_estimates$is.eu[simil_estimates$Country== "GBR" & simil_estimates$Year >1972] <- TRUE
#second wave
simil_estimates$is.eu[simil_estimates$Country== "GRC" & simil_estimates$Year >1980] <- TRUE
#third wave
simil_estimates$is.eu[simil_estimates$Country== "ESP" & simil_estimates$Year >1985] <- TRUE
simil_estimates$is.eu[simil_estimates$Country== "PRT" & simil_estimates$Year >1985] <- TRUE
#fourth wave
simil_estimates$is.eu[simil_estimates$Country== "AUT" & simil_estimates$Year >1994] <- TRUE
simil_estimates$is.eu[simil_estimates$Country== "FIN" & simil_estimates$Year >1994] <- TRUE
simil_estimates$is.eu[simil_estimates$Country== "SWE" & simil_estimates$Year >1994] <- TRUE
#fifth wave
simil_estimates$is.eu[simil_estimates$Country== "CZE" & simil_estimates$Year >2003] <- TRUE
simil_estimates$is.eu[simil_estimates$Country== "HUN" & simil_estimates$Year >2003] <- TRUE
simil_estimates$is.eu[simil_estimates$Country== "POL" & simil_estimates$Year >2003] <- TRUE
simil_estimates$is.eu[simil_estimates$Country== "EST" & simil_estimates$Year >2003] <- TRUE
simil_estimates$is.eu[simil_estimates$Country== "LVA" & simil_estimates$Year >2003] <- TRUE
simil_estimates$is.eu[simil_estimates$Country== "LTU" & simil_estimates$Year >2003] <- TRUE
simil_estimates$is.eu[simil_estimates$Country== "CYP" & simil_estimates$Year >2003] <- TRUE
simil_estimates$is.eu[simil_estimates$Country== "MLT" & simil_estimates$Year >2003] <- TRUE
simil_estimates$is.eu[simil_estimates$Country== "SVK" & simil_estimates$Year >2003] <- TRUE
simil_estimates$is.eu[simil_estimates$Country== "SVN" & simil_estimates$Year >2003] <- TRUE
#sixth wave
simil_estimates$is.eu[simil_estimates$Country== "BGR" & simil_estimates$Year >2006] <- TRUE
simil_estimates$is.eu[simil_estimates$Country== "ROU" & simil_estimates$Year >2006] <- TRUE
#seventh wave
simil_estimates$is.eu[simil_estimates$Country== "HRV" & simil_estimates$Year >2012] <- TRUE

Creating averages and standard deviations for EU member states.

eu_sim <- summarise(group_by(filter(simil_estimates, is.eu==TRUE), Year), 
                      simil_pres = mean(PRES), sd_simil_pres = sd(PRES), 
                      simil_pres_ec = mean(PRES_ec), sd_simil_pres_ec = sd(PRES_ec),
                      simil_lux = mean(LUX, na.rm = TRUE), sd_simil_lux = sd(LUX, na.rm = TRUE))

Plotting averages and standard deviations of similarities

#Plot of average similarities
ggplot(data = eu_sim) +
  geom_point(aes(x=Year, y=simil_lux), na.rm = TRUE, colour = "blue") + 
  geom_smooth(aes(x=Year, y=simil_lux), na.rm = TRUE, se = FALSE, colour = "blue") +
  geom_point(aes(x=Year, y=simil_pres), colour = "green") +
  geom_smooth(aes(x=Year, y=simil_pres), se = FALSE, colour = "green") +
  geom_point(aes(x=Year, y=simil_pres_ec), colour = "red") +
  geom_smooth(aes(x=Year, y=simil_pres_ec), se = FALSE, colour = "red") +
  ylab("Average EU similarities") +
  annotate("text", x = 1983, y = 0.12, label = "Similarity with Luxembourg", colour = "blue") +
  annotate("text", x = 2000, y = 0.22, label = "Similarity with presidency", colour = "red") +
  theme_bw()
ggsave("avsimil.pdf")
Saving 7.29 x 4.51 in image

#Plot of SDs
ggplot(data = eu_sim) +
#  geom_point(aes(x=Year, y=sd_simil_lux), na.rm = TRUE, colour = "blue") + 
#  geom_smooth(aes(x=Year, y=sd_simil_lux), na.rm = TRUE, colour = "blue", se = FALSE) +
  geom_point(aes(x=Year, y=sd_simil_pres), colour = "green") +
  geom_smooth(aes(x=Year, y=sd_simil_pres), colour = "green", se = FALSE) +
  geom_point(aes(x=Year, y=sd_simil_pres_ec), colour = "red") +
  geom_smooth(aes(x=Year, y=sd_simil_pres_ec), colour = "red", se = FALSE) +
  ylab("SDs of EU similarities") +
 # annotate("text", x = 2000, y = 0.03, label = "Similarity with Luxembourg", colour = "blue") +
  annotate("text", x = 1990, y = 0.075, label = "Similarity with presidency", colour = "red") +
  theme_bw()
ggsave("sdsimil.pdf")
Saving 7.29 x 4.51 in image

Similarity with Luxembourg

#Plot of SDs
ggplot(data = eu_sim) +
  geom_point(aes(x=Year, y=sd_simil_lux), na.rm = TRUE, colour = "blue") + 
  geom_smooth(aes(x=Year, y=sd_simil_lux), na.rm = TRUE, colour = "blue", se = FALSE) +
#  geom_point(aes(x=Year, y=sd_simil_pres), colour = "green") +
#  geom_smooth(aes(x=Year, y=sd_simil_pres), colour = "green", se = FALSE) +
#  geom_point(aes(x=Year, y=sd_simil_pres_ec), colour = "red") +
#  geom_smooth(aes(x=Year, y=sd_simil_pres_ec), colour = "red", se = FALSE) +
  ylab("SDs of EU similarities") +
  annotate("text", x = 2000, y = 0.03, label = "Similarity with Luxembourg", colour = "blue") +
#  annotate("text", x = 1990, y = 0.075, label = "Similarity with presidency", colour = "red") +
  theme_bw()
ggsave("sdsimillux.pdf")
Saving 7.29 x 4.51 in image

Combining files for output:

readr::write_csv(left_join(eu_sim, eu_scores, by = "Year"), "eu_estimates.csv")
names(presus)[4] <- "PRESUS_wscore"
names(presusalt)[4] <- "PRESUS_alt_wscore"
names(presrus)[4] <- "PRESRUS_wscore"
names(presrusalt)[4] <- "PRESRUS_alt_wscore"
names(derus)[4] <- "DERUS_wscore"
names(deusa)[4] <- "DEUSA_wscore"
names(luxus)[4] <- "LUXUS_wscore"
names(luxerus)[4] <- "LUXERUS_wscore"
names(pal)[4] <- "PAL_wscore"
names(rusa)[4] <- "RUSA_wscore"
names(chnusa)[4] <- "CHNUSA_wscore"
scores <- full_join(presus, presusalt, by=c("Country", "Year"))
scores <- full_join(scores, presrus, by=c("Country", "Year"))
scores <- full_join(scores, presrusalt, by=c("Country", "Year"))
scores <- full_join(scores, derus, by=c("Country", "Year"))
scores <- full_join(scores, deusa, by=c("Country", "Year"))
scores <- full_join(scores, luxus, by=c("Country", "Year"))
scores <- full_join(scores, luxerus, by=c("Country", "Year"))
scores <- full_join(scores, pal, by=c("Country", "Year"))
scores <- full_join(scores, rusa, by=c("Country", "Year"))
scores <- full_join(scores, chnusa, by=c("Country", "Year"))
simil_scores <- full_join(scores, simil_estimates, by=c("Country", "Year"))
readr::write_csv(select(simil_scores[order(simil_scores$Country, simil_scores$Year),], 
                        c(Country, Year, PRES, PRES_ec, LUX, RUSA_wscore, CHNUSA_wscore, 
                          PRESUS_wscore, PRESUS_alt_wscore, PRESRUS_wscore, 
                          PRESRUS_alt_wscore, DERUS_wscore, DEUSA_wscore, LUXUS_wscore, 
                          LUXERUS_wscore, PAL_wscore)), "estimates.csv")

Splines analysis

library(splines)
spl1 <- lm(sd_rusa ~ ns(Year, knots = c(1986,1993,1999, 2009)), data = eu_scores)
pred1 <- predict(spl1, se = TRUE)
ggplot(eu_scores, aes(Year, sd_rusa)) + 
  geom_ribbon(aes(ymin= pred1$fit-2*pred1$se.fit, ymax=pred1$fit+2*pred1$se.fit), 
              fill = "grey70", alpha = .5) +
  geom_point() +
  geom_line(aes(y=pred1$fit)) +
  theme_bw() +
    ylab("Standard deviation of wordscores for EU") +
  ggtitle("Splines for USA-Russia dimension")
ggsave("sdRUSAspline.pdf")
Saving 7.29 x 4.51 in image

spl2 <- lm(sd_chn ~ ns(Year, knots = c(1986,1993,1999, 2009)), data = eu_scores)
pred2 <- predict(spl2, se = TRUE)
ggplot(eu_scores, aes(Year, sd_chn)) + 
  geom_ribbon(aes(ymin= pred2$fit-2*pred2$se.fit, ymax=pred2$fit+2*pred2$se.fit), 
              fill = "grey70", alpha = .5) +
  geom_point() +
  geom_line(aes(y=pred2$fit)) +
  theme_bw() +
  ylab("Standard deviation of wordscores for EU") +
  ggtitle("Splines for USA-China dimension")
ggsave("sdCHNspline.pdf")
Saving 7.29 x 4.51 in image

spl3 <- lm(sd_simil_pres ~ ns(Year, knots = c(1986,1993,1999, 2009)), data = eu_sim)

pred3 <- predict(spl3, se = TRUE)

ggplot(eu_sim, aes(Year, sd_simil_pres)) + 
  geom_ribbon(aes(ymin= pred3$fit-2*pred3$se.fit, ymax=pred3$fit+2*pred3$se.fit), 
              fill = "grey70", alpha = .5) +
  geom_point() +
  geom_line(aes(y=pred3$fit)) +
  theme_bw()

ggsave("sdsimilspline.pdf")
spl4 <- lm(sd_simil_pres_ec ~ ns(Year, knots = c(1986,1993,1999, 2009)), data = eu_sim)

pred4 <- predict(spl4, se = TRUE)

ggplot(eu_sim, aes(Year, sd_simil_pres_ec)) + 
  geom_ribbon(aes(ymin= pred4$fit-2*pred4$se.fit, ymax=pred4$fit+2*pred4$se.fit), 
              fill = "grey70", alpha = .5) +
  geom_point() +
  geom_line(aes(y=pred4$fit)) +
  theme_bw()

ggsave("sdsimilecspline.pdf")
library(tidyr)

lux_sim <- eu_sim %>% drop_na(sd_simil_lux)

spl5 <- lm(sd_simil_lux ~ ns(Year, knots = c(1986,1993,1999, 2009)), data = lux_sim)

pred5 <- predict(spl5, se = TRUE)

ggplot(lux_sim, aes(Year, sd_simil_lux)) + 
  geom_ribbon(aes(ymin= pred5$fit-2*pred5$se.fit, ymax=pred5$fit+2*pred5$se.fit), 
              fill = "grey70", alpha = .5) +
  geom_point() +
  geom_line(aes(y=pred5$fit)) +
  theme_bw()

ggsave("sdsimilluxspline.pdf")

The coefficients here are essentially slopes of lines for each segment.

screenreg(list(spl1, spl2, spl3, spl4), digits = 3, bold = 0.05, stars = c(0.001, 0.01, 0.05),
          reorder.coef = c(2, 3, 4, 5, 6, 1), 
          custom.coef.names = c("Intercept", "1970-1986", "1987-1993", "1994-1999", 
                                "2000-2009", "2010-present day"), 
          custom.model.names = c("SD EU on RUSA", "SD EU on CHNUSA", "SD Simil Pres", 
                                 "SD Simil Pres (EC) "))
texreg(list(spl1, spl2, spl3, spl4), digits = 3, bold = 0.05, stars = c(0.001, 0.01, 0.05),
          reorder.coef = c(2, 3, 4, 5, 6, 1), 
          custom.coef.names = c("Intercept", "1970-1986", "1987-1993", "1994-1999", 
                                "2000-2009", "2010-present day"), 
          custom.model.names = c("SD EU on RUSA", "SD EU on CHNUSA", "SD Simil Pres", 
                                 "SD Simil Pres (EC) "))
texreg(spl5, digits = 3, bold = 0.05, stars = c(0.001, 0.01, 0.05),
          reorder.coef = c(2, 3, 4, 5, 6, 1), 
          custom.coef.names = c("Intercept", "1970-1986", "1987-1993", "1994-1999", 
                                "2000-2009", "2010-present day"), 
          custom.model.names = "SD Simil Lux")

References

LS0tCnRpdGxlOiAiVGhlIFNvY2lhbGl6YXRpb24gRWZmZWN0IG9mIEVVIE1lbWJlcnNoaXAgb24gRm9yZWlnbiBQb2xpY3kgUHJlZmVyZW5jZXM6IEV2aWRlbmNlIGZyb20gRGViYXRlcyBpbiB0aGUgVW5pdGVkIE5hdGlvbnMiCmF1dGhvcjoKLSBhZmZpbGlhdGlvbjogVW5pdmVyc2l0eSBvZiBMb3ZlCiAgZW1haWw6IG4uY2hlbG90dGlAbGJvcm8uYWMudWsKICBuYW1lOiBOaWNvbGEgQ2hlbG90dGkKLSBhZmZpbGlhdGlvbjogVW5pdmVyc2l0eSBvZiBCaXJtaW5naGFtCiAgZW1haWw6IG4uZGFzYW5kaUBiaGFtLmFjLnVrCiAgbmFtZTogTmloZWVyIERhc2FuZGkKLSBhZmZpbGlhdGlvbjogVW5pdmVyc2l0eSBvZiBFc3NleAogIGVtYWlsOiBzLm1pa2hheWxvdkBlc3NleC5hYy51awogIG5hbWU6IFNsYXZhIE1pa2hheWxvdgpkYXRlOiAyMCBNYXkgMjAxNwpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdAogIHBkZl9kb2N1bWVudDogCiAgICB0b2M6IHllcwogIHdvcmRfZG9jdW1lbnQ6IAogICAgdG9jOiB5ZXMKI2JpYmxpby1zdHlsZTogYXBzcgojYmlibGlvZ3JhcGh5OiBldS5iaWIKdGhhbmtzOiBQYXBlciBwcmVwYXJlZCBmb3IgcHJlc2VudGF0aW9uIGF0IHRoZSA3NXRoIEFubnVhbCBNUFNBIE1lZXRpbmcsIDYtOSBBcHJpbAogIDIwMTcsIENoaWNhZ28uCmFic3RyYWN0OiBEb2VzIG1lbWJlcnNoaXAgb2YgaW50ZXJnb3Zlcm5tZW50YWwgb3JnYW5pemF0aW9ucyBsZWFkIHRvIG1vcmUgc2ltaWxhciBzdGF0ZSBwcmVmZXJlbmNlcyB0aHJvdWdoIGEgc29jaWFsaXphdGlvbiBlZmZlY3Q/IFRoaXMgcXVlc3Rpb24gaGFzIHJlY2VpdmVkIG11Y2ggYXR0ZW50aW9uIGluIElSLiBFbXBpcmljYWwgc3R1ZGllcyBmb2N1c2luZyBvbiB0aGUgRVUsIGNsYWltIEVVIG1lbWJlcnNoaXAgbGVhZHMgdG8gZm9yZWlnbiBwb2xpY3kgY29udmVyZ2VuY2UgYmFzZWQgb24gYW5hbHl6aW5nIFVOIHZvdGluZyBwYXR0ZXJucy4gV2UgYXJndWUgdGhlIHNpZ25pZmljYW50IGNvb3JkaW5hdGlvbiBiZXR3ZWVuIEVVIG1lbWJlciBzdGF0ZXMgd2hlbiB2b3RpbmcgbWVhbnMgdm90aW5nIGNvaGVzaW9uIGRlbW9uc3RyYXRlcyBlZmZlY3RpdmUgY29vcmRpbmF0aW9uLCBub3QgYSBzb2NpYWxpemF0aW9uIGVmZmVjdC4gVG8gZXhhbWluZSB3aGV0aGVyIEVVIG1lbWJlcnNoaXAgaGFzIGEgc29jaWFsaXphdGlvbiBlZmZlY3Qgb24gbWVtYmVyIHN0YXRlcywgd2UgdXNlIGEgbmV3IGRhdGFzZXQgb2YgVU4gR2VuZXJhbCBEZWJhdGUgKEdEKSBzdGF0ZW1lbnRzLiBFdmVyeSB5ZWFyLCBVTiBtZW1iZXIgc3RhdGVzIGRpc2N1c3MgdGhlaXIgcGVyc3BlY3RpdmVzIG9uIG1ham9yIGludGVybmF0aW9uYWwgaXNzdWVzIGluIHRoZSBHRC4gVGhlIGxhY2sgb2YgY29vcmRpbmF0aW9uIGFuZCBleHRlcm5hbCBjb25zdHJhaW50cyBpbiBkZWxpdmVyaW5nIEdEIHN0YXRlbWVudHMgbWFrZXMgdGhlbSBpZGVhbCBmb3IgdGVzdGluZyBzb2NpYWxpemF0aW9uIGVmZmVjdHMgb24gcHJlZmVyZW5jZXMuIEludGVydmlld3Mgd2l0aCBVTiByZXByZXNlbnRhdGl2ZXMgb2YgRVUgbWVtYmVycyBzdXBwb3J0IG91ciBhcmd1bWVudCB0aGF0IHRoZXJlIGlzIHNpZ25pZmljYW50IGNvb3JkaW5hdGlvbiBiZXR3ZWVuIEVVIGRlbGVnYXRpb25zIG9uIFVOIHZvdGVzLCBidXQgbm90IGluIGZvcm11bGF0aW5nIEdEIHN0YXRlbWVudHMuIFdlIGRlcml2ZSBlc3RpbWF0ZXMgb2Ygc3RhdGVzJyBmb3JlaWduIHBvbGljeSBwcmVmZXJlbmNlcyBmcm9tIEdEIHN0YXRlbWVudHMgdXNpbmcgdGV4dCBhbmFseXRpYyB0ZWNobmlxdWVzLCBhbmQgZXhhbWluZSB0aGUgZWZmZWN0IG9mIEVVIG1lbWJlcnNoaXAgYW5kIGVuZ2FnZW1lbnQgb24gcHJlZmVyZW5jZXMgdXNpbmcgdGhlc2UgbmV3IG1lYXN1cmVzLgotLS0KCgojSW50cm9kdWN0aW9uCgpIZXJlIGdvZXMgaW50cm9kdWN0aW9uIHRleHQKCgojVGhlb3J5PwoKSGVyZSBnb2VzIHRoZW9yeS4gRG8gd2UgbmVlZCB0aGVvcnk/CgojRGF0YQoKQmFzaWMgZGVzY3JpcHRpb24gb2YgdGhlIGRhdGEuCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojTG9hZGluZyBwYWNrYWdlcyBhbmQgZGF0YQpsaWJyYXJ5KHJlYWR0ZXh0KQpsaWJyYXJ5KHF1YW50ZWRhKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHN0cmluZ3IpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShyd29ybGRtYXApCmxpYnJhcnkoUkNvbG9yQnJld2VyKQpsaWJyYXJ5KGNsYXNzSW50KQpsaWJyYXJ5KHZlZ2FuKQpsaWJyYXJ5KGJvb3QpCmxpYnJhcnkoaGF2ZW4pCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KHRleHJlZykKYGBgCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKaWYgKCFyZXF1aXJlKCJyZWFkdGV4dCIpKSBkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoImtiZW5vaXQvcmVhZHRleHQiKQoKREFUQV9ESVIgPC0gIn4vRHJvcGJveC9SZXNlYXJjaC9VTiBEYXRhLyIgCgp1bmdkX2ZpbGVzIDwtIHJlYWR0ZXh0KHBhc3RlMChEQVRBX0RJUiwgIkNvbnZlcnRlZCBzZXNzaW9ucy8qIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N2YXJzZnJvbSA9ICJmaWxlbmFtZXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHZzZXA9Il8iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdmFybmFtZXMgPSBjKCJDb3VudHJ5IiwgIlNlc3Npb24iLCAiWWVhciIpKQoKCiNjaGFuZ2luZyByb3cubmFtZXMgdG8gaGF2ZSBvbmx5IGNvdW50cnlfeWVhciwgcmF0aGVyIHRoYW4gZm9sZGVyIHBhdGh3YXkgZnJvbSBgcmVhZHRleHRgLgpyb3cubmFtZXModW5nZF9maWxlcykgPC0gc3RyX3JlcGxhY2Uoc3RyX3JlcGxhY2Uoc2FwcGx5KHN0cl9zcGxpdChyb3cubmFtZXModW5nZF9maWxlcyksICIvIiksYFtgLDIpLCAiLnR4dCIsICIiKSwgIl9cXGR7Mn0iLCAiIikKCmlmICghcmVxdWlyZSgicXVhbnRlZGEiKSkgZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCJrYmVub2l0L3F1YW50ZWRhIikKCnVuZ2RfY29ycHVzIDwtIGNvcnB1cyh1bmdkX2ZpbGVzLCB0ZXh0X2ZpZWxkID0gInRleHQiKSAKCmBgYAoKQ3JlYXRpbmcgZG9jdW1lbnQgZmVhdHVyZSBtYXRyaXguCgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0KI1Rva2VuaXphdGlvbiBhbmQgYmFzaWMgcHJlLXByb2Nlc3NpbmcKdG9rIDwtIHRva2Vucyh1bmdkX2NvcnB1cywgd2hhdCA9ICJ3b3JkIiwKICAgICAgICAgICAgICByZW1vdmVQdW5jdCA9IFRSVUUsCiAgICAgICAgICAgICAgcmVtb3ZlU3ltYm9scyA9IFRSVUUsCiAgICAgICAgICAgICAgcmVtb3ZlTnVtYmVycyA9IFRSVUUsCiAgICAgICAgICAgICAgcmVtb3ZlVHdpdHRlciA9IFRSVUUsCiAgICAgICAgICAgICAgcmVtb3ZlVVJMID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVIeXBoZW5zID0gVFJVRSwKICAgICAgICAgICAgICB2ZXJib3NlID0gVFJVRSkKYGBgCgpgYGB7ciBkZm19CiNERk0gY3JlYXRpb24gZnJvbSB0b2tlbnMsIHJlbW92aW5nIHN0b3B3b3JkcywgYW5kIHN0ZW1taW5nLgpkZm0gPC0gZGZtKHRvaywgCiAgICAgICAgICAgdG9sb3dlciA9IFRSVUUsCiAgICAgICAgICAgcmVtb3ZlPXN0b3B3b3JkcygiU01BUlQiKSwKICAgICAgICAgICBzdGVtPVRSVUUsIAogICAgICAgICAgIHZlcmJvc2UgPSBUUlVFKQoKI1Nob3dpbmcgMTAwIG1vc3QgZnJlcXVyZW50IHRva2VucyBpbiBERk0KdG9wZmVhdHVyZXMoZGZtLCBuID0gMTAwKQoKYGBgCgoKYGBge3J9CiNSZW1vdmluZyBhbnkgZGlnaXRzLiBgZGZtYCBwaWNrcyB1cCBhbnkgc2VwYXJhdGVkIGRpZ2l0cywgbm90IGRpZ2l0cyB0aGF0IGFyZSBwYXJ0IG9mIHRva2Vucy4KI1JlbW92aW5nIGFueSBwdW5jdHVhdGlvbi4gYGRmbWAgcGlja3MgdXAgYW55IHB1bmN0dWF0aW9uIHVubGVzcyBpdCdzIHBhcnQgb2YgYSB0b2tlbi4KI1JlbW92aW5nIGFueSB0b2tlbnMgbGVzcyB0aGFuIGZvdXIgY2hhcmFjdGVycy4KZGZtLm0gPC0gZGZtX3NlbGVjdChkZm0sIGMoIltcXGQtXSIsICJbWzpwdW5jdDpdXSIsICJeLnsxLDN9JCIpLCBzZWxlY3Rpb24gPSAicmVtb3ZlIiwgCiAgICAgICAgICAgICAgICAgICAgdmFsdWV0eXBlPSJyZWdleCIsIHZlcmJvc2UgPSBUUlVFKQoKIzEwMCBsZWFzdCBmcmVxdWVudCB0ZXJtcwp0b3BmZWF0dXJlcyhkZm0ubSwgbiA9IDEwMCwgZGVjcmVhc2luZyA9IEZBTFNFKQpgYGAKCgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0KI0Ryb3BwaW5nIHdvcmRzIHRoYXQgYXBwZWFyIGxlc3MgdGhhbiA1IHRpbWVzIGFuZCBpbiBsZXNzIHRoYW4gMyBkb2N1bWVudHMuCmRmbS50cmltIDwtIGRmbV90cmltKGRmbS5tLCBtaW5fY291bnQgPSA1LCBtaW5fZG9jZnJlcSA9IDMpCgojMTAwIGxlYXN0IGZyZXF1ZW50IHRlcm1zIGluIHRyaW1tZWQgREZNCnRvcGZlYXR1cmVzKGRmbS50cmltLCBuID0gMTAwLCBkZWNyZWFzaW5nID0gRkFMU0UpCgojTGV2ZWwgb2Ygc3BhcnNpdHkgb2YgdHJpbW1lZCBERk0Kc3BhcnNpdHkoZGZtLnRyaW0pCgojTnVtYmVyIG9mIGZlYXR1cmVzIGluIHRyaW1tZWQgREZNCm5mZWF0dXJlKGRmbS50cmltKQpgYGAKCgoKYGBge3IgdGZpZGZ9CgpkZm0udyA8LSBkZm1fd2VpZ2h0KGRmbS50cmltLCB0eXBlID0gInRmaWRmIikKCmBgYAoKCgoKI0FuYWx5c2lzCgoKIyMjV29yZHNjb3JlIGJhc2VkIHBvc2l0aW9ucwpPbmUgcG9zc2libGl0eSB0byBhc3Nlc3MgcG9zaXRpb25zIG9mIEVVIG1lbWJlciBzdGF0ZXMgd2l0aCB0ZXh0IGRhdGEgaXMgdG8gdXNlIFdvcmRzY29yZSAtLSBhIG1ldGhvZG9sb2d5IGZhbWlsaWFyIHRvIHBvbGl0aWNhbCBzY2llbnRpc3RzLiBIZXJlIHdlIGFwcGx5aW5nIGl0IHRvIFVOR0Qgc3BlZWNoZXMgdG8gY2FsY3VsYXRlIG1lYXN1cmVzIG9mIHBvbGFyaXphdGlvbiBpbiB0aGUgVU4gb24gYSBkaW1lbnNpb24gc3RydWN0dXJlZCBieSB0aGUgbWFpbiAoPykgY29uZmxpY3R1YWwgZGltZW5zaW9uIG9mIGludGVybmF0aW9uYWwgcG9saXRpY3MgLS0gVVNBIHZzIFJ1c3NpYS4gCgoKYGBge3Igd29yZHNjb3JlUlVTQSwgaW5jbHVkZT1GQUxTRX0KI1dvcmRzY29yZSBlc3RpbWF0aW9ucyBieSB5ZWFyCnJ1c2EgPC0gZGF0YS5mcmFtZSgpCmZvciAoaSBpbiAxOTcxOjIwMTYpIHsKI0NyZWF0aW5nIGNvcnB1cyBmb3IgMjAxNCwgZm9yIFdvcmRzY29yZSBleGFtcGxlIGJlbG93CnVuZ2RjLmkgPC0gY29ycHVzX3N1YnNldCh1bmdkX2NvcnB1cywgWWVhcj09aSkKCnRvayA8LSB0b2tlbnModW5nZGMuaSwgd2hhdCA9ICJ3b3JkIiwKICAgICAgICAgICAgICByZW1vdmVQdW5jdCA9IFRSVUUsCiAgICAgICAgICAgICAgcmVtb3ZlU3ltYm9scyA9IFRSVUUsCiAgICAgICAgICAgICAgcmVtb3ZlTnVtYmVycyA9IFRSVUUsCiAgICAgICAgICAgICAgcmVtb3ZlVHdpdHRlciA9IFRSVUUsCiAgICAgICAgICAgICAgcmVtb3ZlVVJMID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVIeXBoZW5zID0gVFJVRSwKICAgICAgICAgICAgICB2ZXJib3NlID0gVFJVRSkKCmRmbSA8LSBkZm0odG9rLCAKICAgICAgICAgICB0b2xvd2VyID0gVFJVRSwKICAgICAgICAgICByZW1vdmU9c3RvcHdvcmRzKCJTTUFSVCIpLAogICAgICAgICAgIHN0ZW09VFJVRSwgCiAgICAgICAgICAgdmVyYm9zZSA9IFRSVUUpCgojUmVtb3ZpbmcgYW55IGRpZ2l0cy4gYGRmbWAgcGlja3MgdXAgYW55IHNlcGFyYXRlZCBkaWdpdHMsIG5vdCBkaWdpdHMgdGhhdCBhcmUgcGFydCBvZiB0b2tlbnMuCiNSZW1vdmluZyBhbnkgcHVuY3R1YXRpb24uIGBkZm1gIHBpY2tzIHVwIGFueSBwdW5jdHVhdGlvbiB1bmxlc3MgaXQncyBwYXJ0IG9mIGEgdG9rZW4uCiNSZW1vdmluZyBhbnkgdG9rZW5zIGxlc3MgdGhhbiBmb3VyIGNoYXJhY3RlcnMuCmRmbS5tIDwtIGRmbV9zZWxlY3QoZGZtLCBjKCJbXFxkLV0iLCAiW1s6cHVuY3Q6XV0iLCAiXi57MSwzfSQiKSwgc2VsZWN0aW9uID0gInJlbW92ZSIsIAogICAgICAgICAgICAgICAgICAgIHZhbHVldHlwZT0icmVnZXgiLCB2ZXJib3NlID0gVFJVRSkKCgojRHJvcHBpbmcgd29yZHMgdGhhdCBhcHBlYXIgbGVzcyB0aGFuIDUgdGltZXMgYW5kIGluIGxlc3MgdGhhbiAzIGRvY3VtZW50cy4KZGZtLnRyaW0gPC0gZGZtX3RyaW0oZGZtLm0sIG1pbl9jb3VudCA9IDUsIG1pbl9kb2NmcmVxID0gMykKCiN0ZmlkZiB3ZWlnaHRpbmcKZGZtLncgPC0gcXVhbnRlZGE6OmRmbV93ZWlnaHQoZGZtLnRyaW0sIHR5cGUgPSAidGZpZGYiKQoKCiNSZWZlcmVuY2Ugc2NvcmVzCnJlZnNjb3JlcyA8LSByZXAoTkEsbnJvdyhkZm0udykpCgpyZWZzY29yZXNbc3RyX2RldGVjdChyb3duYW1lcyhkZm0udyksICJSVVMiKV0gPC0gLTEKcmVmc2NvcmVzW3N0cl9kZXRlY3Qocm93bmFtZXMoZGZtLncpLCAiVVNBIildIDwtIDEKCiNXb3Jkc2NvcmUgbW9kZWwKd3MgPC0gdGV4dG1vZGVsX3dvcmRzY29yZXMoZGZtLncsIHJlZnNjb3Jlcywgc2NhbGU9ImxpbmVhciIsIHNtb290aD0xKQp3b3Jkc2NvcmUgPC0gcHJlZGljdCh3cywgcmVzY2FsaW5nPSJub25lIikKCiNXcml0aW5nIHRoZSByZXN1bHRzIGludG8gZGF0YSBmcmFtZQp3b3Jkc2NvcmVzLmkgPC0gZGF0YS5mcmFtZShjYmluZChkb2N2YXJzKHVuZ2RjLmkpLCB3b3Jkc2NvcmVAdGV4dHNjb3JlcyR0ZXh0c2NvcmVfcmF3KSkKCndvcmRzY29yZXMuaSA8LSBkcGx5cjo6cmVuYW1lKHdvcmRzY29yZXMuaSwgd3Njb3JlID0gd29yZHNjb3JlLnRleHRzY29yZXMudGV4dHNjb3JlX3JhdykKCnJ1c2EgPC0gcmJpbmQocnVzYSx3b3Jkc2NvcmVzLmkpCgp9CmBgYAoKT25lIGFsdGVybmF0aXZlIHdvdWxkIGJlIHRvIGFzc2VzcyBtZW1iZXIgc3RhdGVzJyBwb3NpdGlvbnMgb24gYW5vdGhlciBkaW1lbnNpb24gb2YgY29tcGV0aXRpb24gLS0gVVNBIHZzIENoaW5hLiBUaGlzIGlzIG1vcmUgYSB0cmlhbCBhcyBDaGluYS1VU0EgZGltZW5zaW9uIG1heSBub3QgYmUgc2FsaWVudCBlbm91Z2ggdG8gc3RydWN0dXJlIGZvcmVpZ24gcG9saWN5IHByZWZlcmVuY2VzIG9mIEVVIG1lbWJlciBzdGF0ZXMuIEF0IGxlYXN0IG5vdCBzYWxpZW50IGZvciBub3cgKD8pLCBidXQgd2Ugc2hvdWxkIHNlZSBjb252ZXJnZW5jZSBhcm91bmQgMTk4OS8xOTkwLgoKYGBge3Igd29yZHNjb3JlQ0hOVVNBLCBpbmNsdWRlPUZBTFNFfQojV29yZHNjb3JlIGVzdGltYXRpb25zIGJ5IHllYXIKY2hudXNhIDwtIGRhdGEuZnJhbWUoKQpmb3IgKGkgaW4gMTk3MToyMDE2KSB7CiNDcmVhdGluZyBjb3JwdXMgZm9yIDIwMTQsIGZvciBXb3Jkc2NvcmUgZXhhbXBsZSBiZWxvdwp1bmdkYy5pIDwtIGNvcnB1c19zdWJzZXQodW5nZF9jb3JwdXMsIFllYXI9PWkpCgp0b2sgPC0gdG9rZW5zKHVuZ2RjLmksIHdoYXQgPSAid29yZCIsCiAgICAgICAgICAgICAgcmVtb3ZlUHVuY3QgPSBUUlVFLAogICAgICAgICAgICAgIHJlbW92ZVN5bWJvbHMgPSBUUlVFLAogICAgICAgICAgICAgIHJlbW92ZU51bWJlcnMgPSBUUlVFLAogICAgICAgICAgICAgIHJlbW92ZVR3aXR0ZXIgPSBUUlVFLAogICAgICAgICAgICAgIHJlbW92ZVVSTCA9IFRSVUUsCiAgICAgICAgICAgICAgcmVtb3ZlSHlwaGVucyA9IFRSVUUsCiAgICAgICAgICAgICAgdmVyYm9zZSA9IFRSVUUpCgpkZm0gPC0gZGZtKHRvaywgCiAgICAgICAgICAgdG9sb3dlciA9IFRSVUUsCiAgICAgICAgICAgcmVtb3ZlPXN0b3B3b3JkcygiU01BUlQiKSwKICAgICAgICAgICBzdGVtPVRSVUUsIAogICAgICAgICAgIHZlcmJvc2UgPSBUUlVFKQoKI1JlbW92aW5nIGFueSBkaWdpdHMuIGBkZm1gIHBpY2tzIHVwIGFueSBzZXBhcmF0ZWQgZGlnaXRzLCBub3QgZGlnaXRzIHRoYXQgYXJlIHBhcnQgb2YgdG9rZW5zLgojUmVtb3ZpbmcgYW55IHB1bmN0dWF0aW9uLiBgZGZtYCBwaWNrcyB1cCBhbnkgcHVuY3R1YXRpb24gdW5sZXNzIGl0J3MgcGFydCBvZiBhIHRva2VuLgojUmVtb3ZpbmcgYW55IHRva2VucyBsZXNzIHRoYW4gZm91ciBjaGFyYWN0ZXJzLgpkZm0ubSA8LSBkZm1fc2VsZWN0KGRmbSwgYygiW1xcZC1dIiwgIltbOnB1bmN0Ol1dIiwgIl4uezEsM30kIiksIHNlbGVjdGlvbiA9ICJyZW1vdmUiLCAKICAgICAgICAgICAgICAgICAgICB2YWx1ZXR5cGU9InJlZ2V4IiwgdmVyYm9zZSA9IFRSVUUpCgoKI0Ryb3BwaW5nIHdvcmRzIHRoYXQgYXBwZWFyIGxlc3MgdGhhbiA1IHRpbWVzIGFuZCBpbiBsZXNzIHRoYW4gMyBkb2N1bWVudHMuCmRmbS50cmltIDwtIGRmbV90cmltKGRmbS5tLCBtaW5fY291bnQgPSA1LCBtaW5fZG9jZnJlcSA9IDMpCgojdGZpZGYgd2VpZ2h0aW5nCmRmbS53IDwtIHF1YW50ZWRhOjpkZm1fd2VpZ2h0KGRmbS50cmltLCB0eXBlID0gInRmaWRmIikKCgojUmVmZXJlbmNlIHNjb3JlcwpyZWZzY29yZXMgPC0gcmVwKE5BLG5yb3coZGZtLncpKQoKcmVmc2NvcmVzW3N0cl9kZXRlY3Qocm93bmFtZXMoZGZtLncpLCAiQ0hOIildIDwtIC0xCnJlZnNjb3Jlc1tzdHJfZGV0ZWN0KHJvd25hbWVzKGRmbS53KSwgIlVTQSIpXSA8LSAxCgojV29yZHNjb3JlIG1vZGVsCndzIDwtIHRleHRtb2RlbF93b3Jkc2NvcmVzKGRmbS53LCByZWZzY29yZXMsIHNjYWxlPSJsaW5lYXIiLCBzbW9vdGg9MSkKd29yZHNjb3JlIDwtIHByZWRpY3Qod3MsIHJlc2NhbGluZz0ibm9uZSIpCgojV3JpdGluZyB0aGUgcmVzdWx0cyBpbnRvIGRhdGEgZnJhbWUKd29yZHNjb3Jlcy5pIDwtIGRhdGEuZnJhbWUoY2JpbmQoZG9jdmFycyh1bmdkYy5pKSwgd29yZHNjb3JlQHRleHRzY29yZXMkdGV4dHNjb3JlX3JhdykpCgp3b3Jkc2NvcmVzLmkgPC0gZHBseXI6OnJlbmFtZSh3b3Jkc2NvcmVzLmksIHdzY29yZSA9IHdvcmRzY29yZS50ZXh0c2NvcmVzLnRleHRzY29yZV9yYXcpCgpjaG51c2EgPC0gcmJpbmQoY2hudXNhLHdvcmRzY29yZXMuaSkKCn0KYGBgCgoKCmBgYHtyIHdvcmRzY29yZURFVVNBLCBpbmNsdWRlPUZBTFNFfQojV29yZHNjb3JlIGVzdGltYXRpb25zIGJ5IHllYXIKZGV1c2EgPC0gZGF0YS5mcmFtZSgpCmZvciAoaSBpbiAxOTczOjIwMTYpIHsKI0NyZWF0aW5nIGNvcnB1cyBmb3IgMjAxNCwgZm9yIFdvcmRzY29yZSBleGFtcGxlIGJlbG93CnVuZ2RjLmkgPC0gY29ycHVzX3N1YnNldCh1bmdkX2NvcnB1cywgWWVhcj09aSkKCnRvayA8LSB0b2tlbnModW5nZGMuaSwgd2hhdCA9ICJ3b3JkIiwKICAgICAgICAgICAgICByZW1vdmVQdW5jdCA9IFRSVUUsCiAgICAgICAgICAgICAgcmVtb3ZlU3ltYm9scyA9IFRSVUUsCiAgICAgICAgICAgICAgcmVtb3ZlTnVtYmVycyA9IFRSVUUsCiAgICAgICAgICAgICAgcmVtb3ZlVHdpdHRlciA9IFRSVUUsCiAgICAgICAgICAgICAgcmVtb3ZlVVJMID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVIeXBoZW5zID0gVFJVRSwKICAgICAgICAgICAgICB2ZXJib3NlID0gVFJVRSkKCmRmbSA8LSBkZm0odG9rLCAKICAgICAgICAgICB0b2xvd2VyID0gVFJVRSwKICAgICAgICAgICByZW1vdmU9c3RvcHdvcmRzKCJTTUFSVCIpLAogICAgICAgICAgIHN0ZW09VFJVRSwgCiAgICAgICAgICAgdmVyYm9zZSA9IFRSVUUpCgojUmVtb3ZpbmcgYW55IGRpZ2l0cy4gYGRmbWAgcGlja3MgdXAgYW55IHNlcGFyYXRlZCBkaWdpdHMsIG5vdCBkaWdpdHMgdGhhdCBhcmUgcGFydCBvZiB0b2tlbnMuCiNSZW1vdmluZyBhbnkgcHVuY3R1YXRpb24uIGBkZm1gIHBpY2tzIHVwIGFueSBwdW5jdHVhdGlvbiB1bmxlc3MgaXQncyBwYXJ0IG9mIGEgdG9rZW4uCiNSZW1vdmluZyBhbnkgdG9rZW5zIGxlc3MgdGhhbiBmb3VyIGNoYXJhY3RlcnMuCmRmbS5tIDwtIGRmbV9zZWxlY3QoZGZtLCBjKCJbXFxkLV0iLCAiW1s6cHVuY3Q6XV0iLCAiXi57MSwzfSQiKSwgc2VsZWN0aW9uID0gInJlbW92ZSIsIAogICAgICAgICAgICAgICAgICAgIHZhbHVldHlwZT0icmVnZXgiLCB2ZXJib3NlID0gVFJVRSkKCgojRHJvcHBpbmcgd29yZHMgdGhhdCBhcHBlYXIgbGVzcyB0aGFuIDUgdGltZXMgYW5kIGluIGxlc3MgdGhhbiAzIGRvY3VtZW50cy4KZGZtLnRyaW0gPC0gZGZtX3RyaW0oZGZtLm0sIG1pbl9jb3VudCA9IDUsIG1pbl9kb2NmcmVxID0gMykKCiN0ZmlkZiB3ZWlnaHRpbmcKZGZtLncgPC0gcXVhbnRlZGE6OmRmbV93ZWlnaHQoZGZtLnRyaW0sIHR5cGUgPSAidGZpZGYiKQoKCiNSZWZlcmVuY2Ugc2NvcmVzCnJlZnNjb3JlcyA8LSByZXAoTkEsbnJvdyhkZm0udykpCgpyZWZzY29yZXNbc3RyX2RldGVjdChyb3duYW1lcyhkZm0udyksICJERVUiKV0gPC0gLTEKcmVmc2NvcmVzW3N0cl9kZXRlY3Qocm93bmFtZXMoZGZtLncpLCAiVVNBIildIDwtIDEKCiNXb3Jkc2NvcmUgbW9kZWwKd3MgPC0gdGV4dG1vZGVsX3dvcmRzY29yZXMoZGZtLncsIHJlZnNjb3Jlcywgc2NhbGU9ImxpbmVhciIsIHNtb290aD0xKQp3b3Jkc2NvcmUgPC0gcHJlZGljdCh3cywgcmVzY2FsaW5nPSJub25lIikKCiNXcml0aW5nIHRoZSByZXN1bHRzIGludG8gZGF0YSBmcmFtZQp3b3Jkc2NvcmVzLmkgPC0gZGF0YS5mcmFtZShjYmluZChkb2N2YXJzKHVuZ2RjLmkpLCB3b3Jkc2NvcmVAdGV4dHNjb3JlcyR0ZXh0c2NvcmVfcmF3KSkKCndvcmRzY29yZXMuaSA8LSBkcGx5cjo6cmVuYW1lKHdvcmRzY29yZXMuaSwgd3Njb3JlID0gd29yZHNjb3JlLnRleHRzY29yZXMudGV4dHNjb3JlX3JhdykKCmRldXNhIDwtIHJiaW5kKGRldXNhLHdvcmRzY29yZXMuaSkKCn0KYGBgCgoKCgoKYGBge3IgR2VybWFueVJ1c3NpYSwgaW5jbHVkZT1GQUxTRX0KI1dvcmRzY29yZSBlc3RpbWF0aW9ucyBieSB5ZWFyCgpkZXJ1cyA8LSBkYXRhLmZyYW1lKCkKZm9yIChpIGluIDE5NzM6MjAxNikgewojQ3JlYXRpbmcgY29ycHVzIGZvciAyMDE0LCBmb3IgV29yZHNjb3JlIGV4YW1wbGUgYmVsb3cKdW5nZGMuaSA8LSBjb3JwdXNfc3Vic2V0KHVuZ2RfY29ycHVzLCBZZWFyPT1pKQoKdG9rIDwtIHRva2Vucyh1bmdkYy5pLCB3aGF0ID0gIndvcmQiLAogICAgICAgICAgICAgIHJlbW92ZVB1bmN0ID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVTeW1ib2xzID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVOdW1iZXJzID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVUd2l0dGVyID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVVUkwgPSBUUlVFLAogICAgICAgICAgICAgIHJlbW92ZUh5cGhlbnMgPSBUUlVFLAogICAgICAgICAgICAgIHZlcmJvc2UgPSBUUlVFKQoKZGZtIDwtIGRmbSh0b2ssIAogICAgICAgICAgIHRvbG93ZXIgPSBUUlVFLAogICAgICAgICAgIHJlbW92ZT1zdG9wd29yZHMoIlNNQVJUIiksCiAgICAgICAgICAgc3RlbT1UUlVFLCAKICAgICAgICAgICB2ZXJib3NlID0gVFJVRSkKCiNSZW1vdmluZyBhbnkgZGlnaXRzLiBgZGZtYCBwaWNrcyB1cCBhbnkgc2VwYXJhdGVkIGRpZ2l0cywgbm90IGRpZ2l0cyB0aGF0IGFyZSBwYXJ0IG9mIHRva2Vucy4KI1JlbW92aW5nIGFueSBwdW5jdHVhdGlvbi4gYGRmbWAgcGlja3MgdXAgYW55IHB1bmN0dWF0aW9uIHVubGVzcyBpdCdzIHBhcnQgb2YgYSB0b2tlbi4KI1JlbW92aW5nIGFueSB0b2tlbnMgbGVzcyB0aGFuIGZvdXIgY2hhcmFjdGVycy4KZGZtLm0gPC0gZGZtX3NlbGVjdChkZm0sIGMoIltcXGQtXSIsICJbWzpwdW5jdDpdXSIsICJeLnsxLDN9JCIpLCBzZWxlY3Rpb24gPSAicmVtb3ZlIiwgCiAgICAgICAgICAgICAgICAgICAgdmFsdWV0eXBlPSJyZWdleCIsIHZlcmJvc2UgPSBUUlVFKQoKCiNEcm9wcGluZyB3b3JkcyB0aGF0IGFwcGVhciBsZXNzIHRoYW4gNSB0aW1lcyBhbmQgaW4gbGVzcyB0aGFuIDMgZG9jdW1lbnRzLgpkZm0udHJpbSA8LSBkZm1fdHJpbShkZm0ubSwgbWluX2NvdW50ID0gNSwgbWluX2RvY2ZyZXEgPSAzKQoKI3RmaWRmIHdlaWdodGluZwpkZm0udyA8LSBxdWFudGVkYTo6ZGZtX3dlaWdodChkZm0udHJpbSwgdHlwZSA9ICJ0ZmlkZiIpCgoKI1JlZmVyZW5jZSBzY29yZXMKcmVmc2NvcmVzIDwtIHJlcChOQSxucm93KGRmbS53KSkKCnJlZnNjb3Jlc1tzdHJfZGV0ZWN0KHJvd25hbWVzKGRmbS53KSwgIlJVUyIpXSA8LSAtMQpyZWZzY29yZXNbc3RyX2RldGVjdChyb3duYW1lcyhkZm0udyksICJERVUiKV0gPC0gMQoKI1dvcmRzY29yZSBtb2RlbAp3cyA8LSB0ZXh0bW9kZWxfd29yZHNjb3JlcyhkZm0udywgcmVmc2NvcmVzLCBzY2FsZT0ibGluZWFyIiwgc21vb3RoPTEpCndvcmRzY29yZSA8LSBwcmVkaWN0KHdzLCByZXNjYWxpbmc9Im5vbmUiKQoKI1dyaXRpbmcgdGhlIHJlc3VsdHMgaW50byBkYXRhIGZyYW1lCndvcmRzY29yZXMuaSA8LSBkYXRhLmZyYW1lKGNiaW5kKGRvY3ZhcnModW5nZGMuaSksIHdvcmRzY29yZUB0ZXh0c2NvcmVzJHRleHRzY29yZV9yYXcpKQoKd29yZHNjb3Jlcy5pIDwtIGRwbHlyOjpyZW5hbWUod29yZHNjb3Jlcy5pLCB3c2NvcmUgPSB3b3Jkc2NvcmUudGV4dHNjb3Jlcy50ZXh0c2NvcmVfcmF3KQoKZGVydXMgPC0gcmJpbmQoZGVydXMsd29yZHNjb3Jlcy5pKQoKfQpgYGAKCgoKCmBgYHtyIHdvcmRzY29yZUxVWEVSVVMsIGluY2x1ZGU9RkFMU0V9CiNXb3Jkc2NvcmUgZXN0aW1hdGlvbnMgYnkgeWVhcgpsdXhlcnVzIDwtIGRhdGEuZnJhbWUoKQpmb3IgKGkgaW4gIGMoMTk3MToxOTc0LCAxOTc3OjIwMTYpKSB7CiNDcmVhdGluZyBjb3JwdXMgZm9yIDIwMTQsIGZvciBXb3Jkc2NvcmUgZXhhbXBsZSBiZWxvdwp1bmdkYy5pIDwtIGNvcnB1c19zdWJzZXQodW5nZF9jb3JwdXMsIFllYXI9PWkpCgp0b2sgPC0gdG9rZW5zKHVuZ2RjLmksIHdoYXQgPSAid29yZCIsCiAgICAgICAgICAgICAgcmVtb3ZlUHVuY3QgPSBUUlVFLAogICAgICAgICAgICAgIHJlbW92ZVN5bWJvbHMgPSBUUlVFLAogICAgICAgICAgICAgIHJlbW92ZU51bWJlcnMgPSBUUlVFLAogICAgICAgICAgICAgIHJlbW92ZVR3aXR0ZXIgPSBUUlVFLAogICAgICAgICAgICAgIHJlbW92ZVVSTCA9IFRSVUUsCiAgICAgICAgICAgICAgcmVtb3ZlSHlwaGVucyA9IFRSVUUsCiAgICAgICAgICAgICAgdmVyYm9zZSA9IFRSVUUpCgpkZm0gPC0gZGZtKHRvaywgCiAgICAgICAgICAgdG9sb3dlciA9IFRSVUUsCiAgICAgICAgICAgcmVtb3ZlPXN0b3B3b3JkcygiU01BUlQiKSwKICAgICAgICAgICBzdGVtPVRSVUUsIAogICAgICAgICAgIHZlcmJvc2UgPSBUUlVFKQoKI1JlbW92aW5nIGFueSBkaWdpdHMuIGBkZm1gIHBpY2tzIHVwIGFueSBzZXBhcmF0ZWQgZGlnaXRzLCBub3QgZGlnaXRzIHRoYXQgYXJlIHBhcnQgb2YgdG9rZW5zLgojUmVtb3ZpbmcgYW55IHB1bmN0dWF0aW9uLiBgZGZtYCBwaWNrcyB1cCBhbnkgcHVuY3R1YXRpb24gdW5sZXNzIGl0J3MgcGFydCBvZiBhIHRva2VuLgojUmVtb3ZpbmcgYW55IHRva2VucyBsZXNzIHRoYW4gZm91ciBjaGFyYWN0ZXJzLgpkZm0ubSA8LSBkZm1fc2VsZWN0KGRmbSwgYygiW1xcZC1dIiwgIltbOnB1bmN0Ol1dIiwgIl4uezEsM30kIiksIHNlbGVjdGlvbiA9ICJyZW1vdmUiLCAKICAgICAgICAgICAgICAgICAgICB2YWx1ZXR5cGU9InJlZ2V4IiwgdmVyYm9zZSA9IFRSVUUpCgoKI0Ryb3BwaW5nIHdvcmRzIHRoYXQgYXBwZWFyIGxlc3MgdGhhbiA1IHRpbWVzIGFuZCBpbiBsZXNzIHRoYW4gMyBkb2N1bWVudHMuCmRmbS50cmltIDwtIGRmbV90cmltKGRmbS5tLCBtaW5fY291bnQgPSA1LCBtaW5fZG9jZnJlcSA9IDMpCgojdGZpZGYgd2VpZ2h0aW5nCmRmbS53IDwtIHF1YW50ZWRhOjpkZm1fd2VpZ2h0KGRmbS50cmltLCB0eXBlID0gInRmaWRmIikKCgojUmVmZXJlbmNlIHNjb3JlcwpyZWZzY29yZXMgPC0gcmVwKE5BLG5yb3coZGZtLncpKQoKcmVmc2NvcmVzW3N0cl9kZXRlY3Qocm93bmFtZXMoZGZtLncpLCAiUlVTIildIDwtIC0xCnJlZnNjb3Jlc1tzdHJfZGV0ZWN0KHJvd25hbWVzKGRmbS53KSwgIkxVWCIpXSA8LSAxCgojV29yZHNjb3JlIG1vZGVsCndzIDwtIHRleHRtb2RlbF93b3Jkc2NvcmVzKGRmbS53LCByZWZzY29yZXMsIHNjYWxlPSJsaW5lYXIiLCBzbW9vdGg9MSkKd29yZHNjb3JlIDwtIHByZWRpY3Qod3MsIHJlc2NhbGluZz0ibm9uZSIpCgojV3JpdGluZyB0aGUgcmVzdWx0cyBpbnRvIGRhdGEgZnJhbWUKd29yZHNjb3Jlcy5pIDwtIGRhdGEuZnJhbWUoY2JpbmQoZG9jdmFycyh1bmdkYy5pKSwgd29yZHNjb3JlQHRleHRzY29yZXMkdGV4dHNjb3JlX3JhdykpCgp3b3Jkc2NvcmVzLmkgPC0gZHBseXI6OnJlbmFtZSh3b3Jkc2NvcmVzLmksIHdzY29yZSA9IHdvcmRzY29yZS50ZXh0c2NvcmVzLnRleHRzY29yZV9yYXcpCgpsdXhlcnVzIDwtIHJiaW5kKGx1eGVydXMsd29yZHNjb3Jlcy5pKQoKfQpgYGAKCgoKCgoKYGBge3Igd29yZHNjb3JlTFVYVVMsIGluY2x1ZGU9RkFMU0V9CiNXb3Jkc2NvcmUgZXN0aW1hdGlvbnMgYnkgeWVhcgpsdXh1cyA8LSBkYXRhLmZyYW1lKCkKZm9yIChpIGluICBjKDE5NzE6MTk3NCwgMTk3NzoyMDE2KSkgewojQ3JlYXRpbmcgY29ycHVzIGZvciAyMDE0LCBmb3IgV29yZHNjb3JlIGV4YW1wbGUgYmVsb3cKdW5nZGMuaSA8LSBjb3JwdXNfc3Vic2V0KHVuZ2RfY29ycHVzLCBZZWFyPT1pKQoKdG9rIDwtIHRva2Vucyh1bmdkYy5pLCB3aGF0ID0gIndvcmQiLAogICAgICAgICAgICAgIHJlbW92ZVB1bmN0ID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVTeW1ib2xzID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVOdW1iZXJzID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVUd2l0dGVyID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVVUkwgPSBUUlVFLAogICAgICAgICAgICAgIHJlbW92ZUh5cGhlbnMgPSBUUlVFLAogICAgICAgICAgICAgIHZlcmJvc2UgPSBUUlVFKQoKZGZtIDwtIGRmbSh0b2ssIAogICAgICAgICAgIHRvbG93ZXIgPSBUUlVFLAogICAgICAgICAgIHJlbW92ZT1zdG9wd29yZHMoIlNNQVJUIiksCiAgICAgICAgICAgc3RlbT1UUlVFLCAKICAgICAgICAgICB2ZXJib3NlID0gVFJVRSkKCiNSZW1vdmluZyBhbnkgZGlnaXRzLiBgZGZtYCBwaWNrcyB1cCBhbnkgc2VwYXJhdGVkIGRpZ2l0cywgbm90IGRpZ2l0cyB0aGF0IGFyZSBwYXJ0IG9mIHRva2Vucy4KI1JlbW92aW5nIGFueSBwdW5jdHVhdGlvbi4gYGRmbWAgcGlja3MgdXAgYW55IHB1bmN0dWF0aW9uIHVubGVzcyBpdCdzIHBhcnQgb2YgYSB0b2tlbi4KI1JlbW92aW5nIGFueSB0b2tlbnMgbGVzcyB0aGFuIGZvdXIgY2hhcmFjdGVycy4KZGZtLm0gPC0gZGZtX3NlbGVjdChkZm0sIGMoIltcXGQtXSIsICJbWzpwdW5jdDpdXSIsICJeLnsxLDN9JCIpLCBzZWxlY3Rpb24gPSAicmVtb3ZlIiwgCiAgICAgICAgICAgICAgICAgICAgdmFsdWV0eXBlPSJyZWdleCIsIHZlcmJvc2UgPSBUUlVFKQoKCiNEcm9wcGluZyB3b3JkcyB0aGF0IGFwcGVhciBsZXNzIHRoYW4gNSB0aW1lcyBhbmQgaW4gbGVzcyB0aGFuIDMgZG9jdW1lbnRzLgpkZm0udHJpbSA8LSBkZm1fdHJpbShkZm0ubSwgbWluX2NvdW50ID0gNSwgbWluX2RvY2ZyZXEgPSAzKQoKI3RmaWRmIHdlaWdodGluZwpkZm0udyA8LSBxdWFudGVkYTo6ZGZtX3dlaWdodChkZm0udHJpbSwgdHlwZSA9ICJ0ZmlkZiIpCgoKI1JlZmVyZW5jZSBzY29yZXMKcmVmc2NvcmVzIDwtIHJlcChOQSxucm93KGRmbS53KSkKCnJlZnNjb3Jlc1tzdHJfZGV0ZWN0KHJvd25hbWVzKGRmbS53KSwgIkxVWCIpXSA8LSAtMQpyZWZzY29yZXNbc3RyX2RldGVjdChyb3duYW1lcyhkZm0udyksICJVU0EiKV0gPC0gMQoKI1dvcmRzY29yZSBtb2RlbAp3cyA8LSB0ZXh0bW9kZWxfd29yZHNjb3JlcyhkZm0udywgcmVmc2NvcmVzLCBzY2FsZT0ibGluZWFyIiwgc21vb3RoPTEpCndvcmRzY29yZSA8LSBwcmVkaWN0KHdzLCByZXNjYWxpbmc9Im5vbmUiKQoKI1dyaXRpbmcgdGhlIHJlc3VsdHMgaW50byBkYXRhIGZyYW1lCndvcmRzY29yZXMuaSA8LSBkYXRhLmZyYW1lKGNiaW5kKGRvY3ZhcnModW5nZGMuaSksIHdvcmRzY29yZUB0ZXh0c2NvcmVzJHRleHRzY29yZV9yYXcpKQoKd29yZHNjb3Jlcy5pIDwtIGRwbHlyOjpyZW5hbWUod29yZHNjb3Jlcy5pLCB3c2NvcmUgPSB3b3Jkc2NvcmUudGV4dHNjb3Jlcy50ZXh0c2NvcmVfcmF3KQoKbHV4dXMgPC0gcmJpbmQobHV4dXMsd29yZHNjb3Jlcy5pKQoKfQpgYGAKCgoKCgpgYGB7ciBwYWwsIGluY2x1ZGU9RkFMU0V9CiNXb3Jkc2NvcmUgZXN0aW1hdGlvbnMgYnkgeWVhcgpwYWwgPC0gZGF0YS5mcmFtZSgpCmZvciAoaSBpbiAgMTk5ODoyMDE2KSB7CiNDcmVhdGluZyBjb3JwdXMgZm9yIDIwMTQsIGZvciBXb3Jkc2NvcmUgZXhhbXBsZSBiZWxvdwp1bmdkYy5pIDwtIGNvcnB1c19zdWJzZXQodW5nZF9jb3JwdXMsIFllYXI9PWkpCgp0b2sgPC0gdG9rZW5zKHVuZ2RjLmksIHdoYXQgPSAid29yZCIsCiAgICAgICAgICAgICAgcmVtb3ZlUHVuY3QgPSBUUlVFLAogICAgICAgICAgICAgIHJlbW92ZVN5bWJvbHMgPSBUUlVFLAogICAgICAgICAgICAgIHJlbW92ZU51bWJlcnMgPSBUUlVFLAogICAgICAgICAgICAgIHJlbW92ZVR3aXR0ZXIgPSBUUlVFLAogICAgICAgICAgICAgIHJlbW92ZVVSTCA9IFRSVUUsCiAgICAgICAgICAgICAgcmVtb3ZlSHlwaGVucyA9IFRSVUUsCiAgICAgICAgICAgICAgdmVyYm9zZSA9IFRSVUUpCgpkZm0gPC0gZGZtKHRvaywgCiAgICAgICAgICAgdG9sb3dlciA9IFRSVUUsCiAgICAgICAgICAgcmVtb3ZlPXN0b3B3b3JkcygiU01BUlQiKSwKICAgICAgICAgICBzdGVtPVRSVUUsIAogICAgICAgICAgIHZlcmJvc2UgPSBUUlVFKQoKI1JlbW92aW5nIGFueSBkaWdpdHMuIGBkZm1gIHBpY2tzIHVwIGFueSBzZXBhcmF0ZWQgZGlnaXRzLCBub3QgZGlnaXRzIHRoYXQgYXJlIHBhcnQgb2YgdG9rZW5zLgojUmVtb3ZpbmcgYW55IHB1bmN0dWF0aW9uLiBgZGZtYCBwaWNrcyB1cCBhbnkgcHVuY3R1YXRpb24gdW5sZXNzIGl0J3MgcGFydCBvZiBhIHRva2VuLgojUmVtb3ZpbmcgYW55IHRva2VucyBsZXNzIHRoYW4gZm91ciBjaGFyYWN0ZXJzLgpkZm0ubSA8LSBkZm1fc2VsZWN0KGRmbSwgYygiW1xcZC1dIiwgIltbOnB1bmN0Ol1dIiwgIl4uezEsM30kIiksIHNlbGVjdGlvbiA9ICJyZW1vdmUiLCAKICAgICAgICAgICAgICAgICAgICB2YWx1ZXR5cGU9InJlZ2V4IiwgdmVyYm9zZSA9IFRSVUUpCgoKI0Ryb3BwaW5nIHdvcmRzIHRoYXQgYXBwZWFyIGxlc3MgdGhhbiA1IHRpbWVzIGFuZCBpbiBsZXNzIHRoYW4gMyBkb2N1bWVudHMuCmRmbS50cmltIDwtIGRmbV90cmltKGRmbS5tLCBtaW5fY291bnQgPSA1LCBtaW5fZG9jZnJlcSA9IDMpCgojdGZpZGYgd2VpZ2h0aW5nCmRmbS53IDwtIHF1YW50ZWRhOjpkZm1fd2VpZ2h0KGRmbS50cmltLCB0eXBlID0gInRmaWRmIikKCgojUmVmZXJlbmNlIHNjb3JlcwpyZWZzY29yZXMgPC0gcmVwKE5BLG5yb3coZGZtLncpKQoKcmVmc2NvcmVzW3N0cl9kZXRlY3Qocm93bmFtZXMoZGZtLncpLCAiUFNFIildIDwtIC0xCnJlZnNjb3Jlc1tzdHJfZGV0ZWN0KHJvd25hbWVzKGRmbS53KSwgIklTUiIpXSA8LSAxCgojV29yZHNjb3JlIG1vZGVsCndzIDwtIHRleHRtb2RlbF93b3Jkc2NvcmVzKGRmbS53LCByZWZzY29yZXMsIHNjYWxlPSJsaW5lYXIiLCBzbW9vdGg9MSkKd29yZHNjb3JlIDwtIHByZWRpY3Qod3MsIHJlc2NhbGluZz0ibm9uZSIpCgojV3JpdGluZyB0aGUgcmVzdWx0cyBpbnRvIGRhdGEgZnJhbWUKd29yZHNjb3Jlcy5pIDwtIGRhdGEuZnJhbWUoY2JpbmQoZG9jdmFycyh1bmdkYy5pKSwgd29yZHNjb3JlQHRleHRzY29yZXMkdGV4dHNjb3JlX3JhdykpCgp3b3Jkc2NvcmVzLmkgPC0gZHBseXI6OnJlbmFtZSh3b3Jkc2NvcmVzLmksIHdzY29yZSA9IHdvcmRzY29yZS50ZXh0c2NvcmVzLnRleHRzY29yZV9yYXcpCgpwYWwgPC0gcmJpbmQocGFsLHdvcmRzY29yZXMuaSkKCn0KYGBgCgoKYGBge3IgRVUgcHJlc2lkZW50LCBpbmNsdWRlPUZBTFNFfQpwcmVzaWRlbmN5IDwtIHJlYWR4bDo6cmVhZF9leGNlbCgicHJlc2lkZW5jeS54bHN4IikKCmBgYAoKCgpgYGB7ciBQcmVzaWRlbmN5VVNBLCBpbmNsdWRlPUZBTFNFfQoKcHJlc3VzIDwtIGRhdGEuZnJhbWUoKQoKZm9yIChpIGluIGMoMTk3MDoyMDE2KSkgewogIAojQ3JlYXRpbmcgY29ycHVzIGZvciBlYWNoIHllYXIKdW5nZGMuaSA8LSBjb3JwdXNfc3Vic2V0KHVuZ2RfY29ycHVzLCBZZWFyPT1pKQoKdG9rIDwtIHRva2Vucyh1bmdkYy5pLCB3aGF0ID0gIndvcmQiLAogICAgICAgICAgICAgIHJlbW92ZVB1bmN0ID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVTeW1ib2xzID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVOdW1iZXJzID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVUd2l0dGVyID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVVUkwgPSBUUlVFLAogICAgICAgICAgICAgIHJlbW92ZUh5cGhlbnMgPSBUUlVFLAogICAgICAgICAgICAgIHZlcmJvc2UgPSBUUlVFKQoKCmRmbSA8LSBkZm0odG9rLCAKICAgICAgICAgICB0b2xvd2VyID0gVFJVRSwKICAgICAgICAgICByZW1vdmU9c3RvcHdvcmRzKCJTTUFSVCIpLAogICAgICAgICAgIHN0ZW09VFJVRSwgCiAgICAgICAgICAgdmVyYm9zZSA9IFRSVUUpCgojUmVtb3ZpbmcgYW55IGRpZ2l0cy4gYGRmbWAgcGlja3MgdXAgYW55IHNlcGFyYXRlZCBkaWdpdHMsIG5vdCBkaWdpdHMgdGhhdCBhcmUgcGFydCBvZiB0b2tlbnMuCiNSZW1vdmluZyBhbnkgcHVuY3R1YXRpb24uIGBkZm1gIHBpY2tzIHVwIGFueSBwdW5jdHVhdGlvbiB1bmxlc3MgaXQncyBwYXJ0IG9mIGEgdG9rZW4uCiNSZW1vdmluZyBhbnkgdG9rZW5zIGxlc3MgdGhhbiBmb3VyIGNoYXJhY3RlcnMuCmRmbS5tIDwtIGRmbV9zZWxlY3QoZGZtLCBjKCJbXFxkLV0iLCAiW1s6cHVuY3Q6XV0iLCAiXi57MSwzfSQiKSwgc2VsZWN0aW9uID0gInJlbW92ZSIsIAogICAgICAgICAgICAgICAgICAgIHZhbHVldHlwZT0icmVnZXgiLCB2ZXJib3NlID0gVFJVRSkKCgojRHJvcHBpbmcgd29yZHMgdGhhdCBhcHBlYXIgbGVzcyB0aGFuIDUgdGltZXMgYW5kIGluIGxlc3MgdGhhbiAzIGRvY3VtZW50cy4KZGZtLnRyaW0gPC0gZGZtX3RyaW0oZGZtLm0sIG1pbl9jb3VudCA9IDUsIG1pbl9kb2NmcmVxID0gMykKCiN0ZmlkZiB3ZWlnaHRpbmcKZGZtLncgPC0gZGZtX3dlaWdodChkZm0udHJpbSwgdHlwZSA9ICJ0ZmlkZiIpCgoKI2hvbGRlcnMgZm9yIGNvdW50cnkgbmFtZXMgaW4gZGlzdGFuY2UgbWVhc3VyZXMgYmVsb3cKcHJlcyA8LSBwYXN0ZShwcmVzaWRlbmN5JENvdW50cnlbcHJlc2lkZW5jeSRZZWFyPT1pXSwgaSwgc2VwPSJfIikKCgojUmVmZXJlbmNlIHNjb3JlcwpyZWZzY29yZXMgPC0gcmVwKE5BLG5yb3coZGZtLncpKQoKcmVmc2NvcmVzW3Jvd25hbWVzKGRmbS53KT09cHJlcyBdIDwtIC0xCnJlZnNjb3Jlc1tzdHJfZGV0ZWN0KHJvd25hbWVzKGRmbS53KSwgIlVTQSIpXSA8LSAxCgojV29yZHNjb3JlIG1vZGVsCndzIDwtIHRleHRtb2RlbF93b3Jkc2NvcmVzKGRmbS53LCByZWZzY29yZXMsIHNjYWxlPSJsaW5lYXIiLCBzbW9vdGg9MSkKd29yZHNjb3JlIDwtIHByZWRpY3Qod3MsIHJlc2NhbGluZz0ibm9uZSIpCgojV3JpdGluZyB0aGUgcmVzdWx0cyBpbnRvIGRhdGEgZnJhbWUKd29yZHNjb3Jlcy5pIDwtIGRhdGEuZnJhbWUoY2JpbmQoZG9jdmFycyh1bmdkYy5pKSwgd29yZHNjb3JlQHRleHRzY29yZXMkdGV4dHNjb3JlX3JhdykpCgp3b3Jkc2NvcmVzLmkgPC0gZHBseXI6OnJlbmFtZSh3b3Jkc2NvcmVzLmksIHdzY29yZSA9IHdvcmRzY29yZS50ZXh0c2NvcmVzLnRleHRzY29yZV9yYXcpCgpwcmVzdXMgPC0gcmJpbmQocHJlc3VzLHdvcmRzY29yZXMuaSkKCn0KCmBgYAoKCgoKYGBge3IgUHJlc2lkZW5jeUFMVHVzYSwgaW5jbHVkZT1GQUxTRX0KI0VVIHByZXNpZGVudAoKcHJlc3VzYWx0IDwtIGRhdGEuZnJhbWUoKQoKZm9yIChpIGluIGMoMTk3MDoyMDE2KSkgewogIAojQ3JlYXRpbmcgY29ycHVzIGZvciBlYWNoIHllYXIKdW5nZGMuaSA8LSBjb3JwdXNfc3Vic2V0KHVuZ2RfY29ycHVzLCBZZWFyPT1pKQoKdG9rIDwtIHRva2Vucyh1bmdkYy5pLCB3aGF0ID0gIndvcmQiLAogICAgICAgICAgICAgIHJlbW92ZVB1bmN0ID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVTeW1ib2xzID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVOdW1iZXJzID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVUd2l0dGVyID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVVUkwgPSBUUlVFLAogICAgICAgICAgICAgIHJlbW92ZUh5cGhlbnMgPSBUUlVFLAogICAgICAgICAgICAgIHZlcmJvc2UgPSBUUlVFKQoKCmRmbSA8LSBkZm0odG9rLCAKICAgICAgICAgICB0b2xvd2VyID0gVFJVRSwKICAgICAgICAgICByZW1vdmU9c3RvcHdvcmRzKCJTTUFSVCIpLAogICAgICAgICAgIHN0ZW09VFJVRSwgCiAgICAgICAgICAgdmVyYm9zZSA9IFRSVUUpCgojUmVtb3ZpbmcgYW55IGRpZ2l0cy4gYGRmbWAgcGlja3MgdXAgYW55IHNlcGFyYXRlZCBkaWdpdHMsIG5vdCBkaWdpdHMgdGhhdCBhcmUgcGFydCBvZiB0b2tlbnMuCiNSZW1vdmluZyBhbnkgcHVuY3R1YXRpb24uIGBkZm1gIHBpY2tzIHVwIGFueSBwdW5jdHVhdGlvbiB1bmxlc3MgaXQncyBwYXJ0IG9mIGEgdG9rZW4uCiNSZW1vdmluZyBhbnkgdG9rZW5zIGxlc3MgdGhhbiBmb3VyIGNoYXJhY3RlcnMuCmRmbS5tIDwtIGRmbV9zZWxlY3QoZGZtLCBjKCJbXFxkLV0iLCAiW1s6cHVuY3Q6XV0iLCAiXi57MSwzfSQiKSwgc2VsZWN0aW9uID0gInJlbW92ZSIsIAogICAgICAgICAgICAgICAgICAgIHZhbHVldHlwZT0icmVnZXgiLCB2ZXJib3NlID0gVFJVRSkKCgojRHJvcHBpbmcgd29yZHMgdGhhdCBhcHBlYXIgbGVzcyB0aGFuIDUgdGltZXMgYW5kIGluIGxlc3MgdGhhbiAzIGRvY3VtZW50cy4KZGZtLnRyaW0gPC0gZGZtX3RyaW0oZGZtLm0sIG1pbl9jb3VudCA9IDUsIG1pbl9kb2NmcmVxID0gMykKCiN0ZmlkZiB3ZWlnaHRpbmcKZGZtLncgPC0gZGZtX3dlaWdodChkZm0udHJpbSwgdHlwZSA9ICJ0ZmlkZiIpCgoKI2hvbGRlcnMgZm9yIGNvdW50cnkgbmFtZXMgaW4gZGlzdGFuY2UgbWVhc3VyZXMgYmVsb3cKcHJlc19hbHQgPC0gcGFzdGUocHJlc2lkZW5jeSRDb3VudHJ5X2FsdFtwcmVzaWRlbmN5JFllYXI9PWldLCBpLCBzZXA9Il8iKQoKCiNSZWZlcmVuY2Ugc2NvcmVzCnJlZnNjb3JlcyA8LSByZXAoTkEsbnJvdyhkZm0udykpCgpyZWZzY29yZXNbcm93bmFtZXMoZGZtLncpPT1wcmVzX2FsdCBdIDwtIC0xCnJlZnNjb3Jlc1tzdHJfZGV0ZWN0KHJvd25hbWVzKGRmbS53KSwgIlVTQSIpXSA8LSAxCgojV29yZHNjb3JlIG1vZGVsCndzIDwtIHRleHRtb2RlbF93b3Jkc2NvcmVzKGRmbS53LCByZWZzY29yZXMsIHNjYWxlPSJsaW5lYXIiLCBzbW9vdGg9MSkKd29yZHNjb3JlIDwtIHByZWRpY3Qod3MsIHJlc2NhbGluZz0ibm9uZSIpCgojV3JpdGluZyB0aGUgcmVzdWx0cyBpbnRvIGRhdGEgZnJhbWUKd29yZHNjb3Jlcy5pIDwtIGRhdGEuZnJhbWUoY2JpbmQoZG9jdmFycyh1bmdkYy5pKSwgd29yZHNjb3JlQHRleHRzY29yZXMkdGV4dHNjb3JlX3JhdykpCgp3b3Jkc2NvcmVzLmkgPC0gZHBseXI6OnJlbmFtZSh3b3Jkc2NvcmVzLmksIHdzY29yZSA9IHdvcmRzY29yZS50ZXh0c2NvcmVzLnRleHRzY29yZV9yYXcpCgpwcmVzdXNhbHQgPC0gcmJpbmQocHJlc3VzYWx0LHdvcmRzY29yZXMuaSkKCn0KCmBgYAoKCgoKCmBgYHtyIFByZXNpZGVuY3lSdXNzaWEsIGluY2x1ZGU9RkFMU0V9CiNFVSBwcmVzaWRlbnQKCgpwcmVzcnVzIDwtIGRhdGEuZnJhbWUoKQoKZm9yIChpIGluIGMoMTk3MToyMDE2KSkgewogIAojQ3JlYXRpbmcgY29ycHVzIGZvciBlYWNoIHllYXIKdW5nZGMuaSA8LSBjb3JwdXNfc3Vic2V0KHVuZ2RfY29ycHVzLCBZZWFyPT1pKQoKdG9rIDwtIHRva2Vucyh1bmdkYy5pLCB3aGF0ID0gIndvcmQiLAogICAgICAgICAgICAgIHJlbW92ZVB1bmN0ID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVTeW1ib2xzID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVOdW1iZXJzID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVUd2l0dGVyID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVVUkwgPSBUUlVFLAogICAgICAgICAgICAgIHJlbW92ZUh5cGhlbnMgPSBUUlVFLAogICAgICAgICAgICAgIHZlcmJvc2UgPSBUUlVFKQoKCmRmbSA8LSBkZm0odG9rLCAKICAgICAgICAgICB0b2xvd2VyID0gVFJVRSwKICAgICAgICAgICByZW1vdmU9c3RvcHdvcmRzKCJTTUFSVCIpLAogICAgICAgICAgIHN0ZW09VFJVRSwgCiAgICAgICAgICAgdmVyYm9zZSA9IFRSVUUpCgojUmVtb3ZpbmcgYW55IGRpZ2l0cy4gYGRmbWAgcGlja3MgdXAgYW55IHNlcGFyYXRlZCBkaWdpdHMsIG5vdCBkaWdpdHMgdGhhdCBhcmUgcGFydCBvZiB0b2tlbnMuCiNSZW1vdmluZyBhbnkgcHVuY3R1YXRpb24uIGBkZm1gIHBpY2tzIHVwIGFueSBwdW5jdHVhdGlvbiB1bmxlc3MgaXQncyBwYXJ0IG9mIGEgdG9rZW4uCiNSZW1vdmluZyBhbnkgdG9rZW5zIGxlc3MgdGhhbiBmb3VyIGNoYXJhY3RlcnMuCmRmbS5tIDwtIGRmbV9zZWxlY3QoZGZtLCBjKCJbXFxkLV0iLCAiW1s6cHVuY3Q6XV0iLCAiXi57MSwzfSQiKSwgc2VsZWN0aW9uID0gInJlbW92ZSIsIAogICAgICAgICAgICAgICAgICAgIHZhbHVldHlwZT0icmVnZXgiLCB2ZXJib3NlID0gVFJVRSkKCgojRHJvcHBpbmcgd29yZHMgdGhhdCBhcHBlYXIgbGVzcyB0aGFuIDUgdGltZXMgYW5kIGluIGxlc3MgdGhhbiAzIGRvY3VtZW50cy4KZGZtLnRyaW0gPC0gZGZtX3RyaW0oZGZtLm0sIG1pbl9jb3VudCA9IDUsIG1pbl9kb2NmcmVxID0gMykKCiN0ZmlkZiB3ZWlnaHRpbmcKZGZtLncgPC0gZGZtX3dlaWdodChkZm0udHJpbSwgdHlwZSA9ICJ0ZmlkZiIpCgoKI2hvbGRlcnMgZm9yIGNvdW50cnkgbmFtZXMgaW4gZGlzdGFuY2UgbWVhc3VyZXMgYmVsb3cKcHJlcyA8LSBwYXN0ZShwcmVzaWRlbmN5JENvdW50cnlbcHJlc2lkZW5jeSRZZWFyPT1pXSwgaSwgc2VwPSJfIikKCgojUmVmZXJlbmNlIHNjb3JlcwpyZWZzY29yZXMgPC0gcmVwKE5BLG5yb3coZGZtLncpKQoKcmVmc2NvcmVzW3N0cl9kZXRlY3Qocm93bmFtZXMoZGZtLncpLCAiUlVTIildIDwtIC0xCnJlZnNjb3Jlc1tyb3duYW1lcyhkZm0udyk9PXByZXMgXSA8LSAxCgojV29yZHNjb3JlIG1vZGVsCndzIDwtIHRleHRtb2RlbF93b3Jkc2NvcmVzKGRmbS53LCByZWZzY29yZXMsIHNjYWxlPSJsaW5lYXIiLCBzbW9vdGg9MSkKd29yZHNjb3JlIDwtIHByZWRpY3Qod3MsIHJlc2NhbGluZz0ibm9uZSIpCgojV3JpdGluZyB0aGUgcmVzdWx0cyBpbnRvIGRhdGEgZnJhbWUKd29yZHNjb3Jlcy5pIDwtIGRhdGEuZnJhbWUoY2JpbmQoZG9jdmFycyh1bmdkYy5pKSwgd29yZHNjb3JlQHRleHRzY29yZXMkdGV4dHNjb3JlX3JhdykpCgp3b3Jkc2NvcmVzLmkgPC0gZHBseXI6OnJlbmFtZSh3b3Jkc2NvcmVzLmksIHdzY29yZSA9IHdvcmRzY29yZS50ZXh0c2NvcmVzLnRleHRzY29yZV9yYXcpCgpwcmVzcnVzIDwtIHJiaW5kKHByZXNydXMsd29yZHNjb3Jlcy5pKQoKfQoKYGBgCgoKCgpgYGB7ciBQcmVzaWRlbmN5QUxUcnVzLCBpbmNsdWRlPUZBTFNFfQojRVUgcHJlc2lkZW50CgpwcmVzcnVzYWx0IDwtIGRhdGEuZnJhbWUoKQoKZm9yIChpIGluIGMoMTk3MToyMDE2KSkgewogIAojQ3JlYXRpbmcgY29ycHVzIGZvciBlYWNoIHllYXIKdW5nZGMuaSA8LSBjb3JwdXNfc3Vic2V0KHVuZ2RfY29ycHVzLCBZZWFyPT1pKQoKdG9rIDwtIHRva2Vucyh1bmdkYy5pLCB3aGF0ID0gIndvcmQiLAogICAgICAgICAgICAgIHJlbW92ZVB1bmN0ID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVTeW1ib2xzID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVOdW1iZXJzID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVUd2l0dGVyID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVVUkwgPSBUUlVFLAogICAgICAgICAgICAgIHJlbW92ZUh5cGhlbnMgPSBUUlVFLAogICAgICAgICAgICAgIHZlcmJvc2UgPSBUUlVFKQoKCmRmbSA8LSBkZm0odG9rLCAKICAgICAgICAgICB0b2xvd2VyID0gVFJVRSwKICAgICAgICAgICByZW1vdmU9c3RvcHdvcmRzKCJTTUFSVCIpLAogICAgICAgICAgIHN0ZW09VFJVRSwgCiAgICAgICAgICAgdmVyYm9zZSA9IFRSVUUpCgojUmVtb3ZpbmcgYW55IGRpZ2l0cy4gYGRmbWAgcGlja3MgdXAgYW55IHNlcGFyYXRlZCBkaWdpdHMsIG5vdCBkaWdpdHMgdGhhdCBhcmUgcGFydCBvZiB0b2tlbnMuCiNSZW1vdmluZyBhbnkgcHVuY3R1YXRpb24uIGBkZm1gIHBpY2tzIHVwIGFueSBwdW5jdHVhdGlvbiB1bmxlc3MgaXQncyBwYXJ0IG9mIGEgdG9rZW4uCiNSZW1vdmluZyBhbnkgdG9rZW5zIGxlc3MgdGhhbiBmb3VyIGNoYXJhY3RlcnMuCmRmbS5tIDwtIGRmbV9zZWxlY3QoZGZtLCBjKCJbXFxkLV0iLCAiW1s6cHVuY3Q6XV0iLCAiXi57MSwzfSQiKSwgc2VsZWN0aW9uID0gInJlbW92ZSIsIAogICAgICAgICAgICAgICAgICAgIHZhbHVldHlwZT0icmVnZXgiLCB2ZXJib3NlID0gVFJVRSkKCgojRHJvcHBpbmcgd29yZHMgdGhhdCBhcHBlYXIgbGVzcyB0aGFuIDUgdGltZXMgYW5kIGluIGxlc3MgdGhhbiAzIGRvY3VtZW50cy4KZGZtLnRyaW0gPC0gZGZtX3RyaW0oZGZtLm0sIG1pbl9jb3VudCA9IDUsIG1pbl9kb2NmcmVxID0gMykKCiN0ZmlkZiB3ZWlnaHRpbmcKZGZtLncgPC0gZGZtX3dlaWdodChkZm0udHJpbSwgdHlwZSA9ICJ0ZmlkZiIpCgoKI2hvbGRlcnMgZm9yIGNvdW50cnkgbmFtZXMgaW4gZGlzdGFuY2UgbWVhc3VyZXMgYmVsb3cKcHJlc19hbHQgPC0gcGFzdGUocHJlc2lkZW5jeSRDb3VudHJ5X2FsdFtwcmVzaWRlbmN5JFllYXI9PWldLCBpLCBzZXA9Il8iKQoKCiNSZWZlcmVuY2Ugc2NvcmVzCnJlZnNjb3JlcyA8LSByZXAoTkEsbnJvdyhkZm0udykpCgpyZWZzY29yZXNbc3RyX2RldGVjdChyb3duYW1lcyhkZm0udyksICJSVVMiKV0gPC0gLTEKcmVmc2NvcmVzW3Jvd25hbWVzKGRmbS53KT09cHJlc19hbHQgXSA8LSAxCgojV29yZHNjb3JlIG1vZGVsCndzIDwtIHRleHRtb2RlbF93b3Jkc2NvcmVzKGRmbS53LCByZWZzY29yZXMsIHNjYWxlPSJsaW5lYXIiLCBzbW9vdGg9MSkKd29yZHNjb3JlIDwtIHByZWRpY3Qod3MsIHJlc2NhbGluZz0ibm9uZSIpCgojV3JpdGluZyB0aGUgcmVzdWx0cyBpbnRvIGRhdGEgZnJhbWUKd29yZHNjb3Jlcy5pIDwtIGRhdGEuZnJhbWUoY2JpbmQoZG9jdmFycyh1bmdkYy5pKSwgd29yZHNjb3JlQHRleHRzY29yZXMkdGV4dHNjb3JlX3JhdykpCgp3b3Jkc2NvcmVzLmkgPC0gZHBseXI6OnJlbmFtZSh3b3Jkc2NvcmVzLmksIHdzY29yZSA9IHdvcmRzY29yZS50ZXh0c2NvcmVzLnRleHRzY29yZV9yYXcpCgpwcmVzcnVzYWx0IDwtIHJiaW5kKHByZXNydXNhbHQsd29yZHNjb3Jlcy5pKQoKfQoKYGBgCgoKCldlIGNhbiBsb29rIGF0IHN0YW5kYXJkIGRldmlhdGlvbiBvZiBFVSBwb3NpdGlvbnMgb24gdGhlc2UgdHdvIGRpbWVuc2lvbnMuIFRoZSBoeXBvdGhlc2lzIGlzIHRoYXQgdGhlcmUncyBpbmNyZWFzaW5nIGNvbnZlcmdlbmNlIChsb3dlciB2YXJpYXRpb24pIGJldHdlZW4gRVUgbWVtYmVyIHN0YXRlcyBhcyBhIHJlc3VsdCBvZiBzb2NpYWxpemF0aW9uLiAgCgpgYGB7cn0KI0xvZ2ljYWxzIGZvciBFVSBtZW1iZXIgc3RhdGVzCkVVIDwtIGMoIkJFTCIsICJGUkEiLCAiREVVIiwgIklUQSIsICJMVVgiLCAiTkxEIikKYGBgCgoKYGBge3J9CnJ1c2EgPC0gcnVzYSAlPiUgbXV0YXRlKGlzLmV1ID0gQ291bnRyeSAlaW4lIEVVKQoKI2ZpcnN0IHdhdmUKcnVzYSRpcy5ldVtydXNhJENvdW50cnk9PSAiRE5LIiAmIHJ1c2EkWWVhciA+MTk3Ml0gPC0gVFJVRQpydXNhJGlzLmV1W3J1c2EkQ291bnRyeT09ICJJUkwiICYgcnVzYSRZZWFyID4xOTcyXSA8LSBUUlVFCnJ1c2EkaXMuZXVbcnVzYSRDb3VudHJ5PT0gIkdCUiIgJiBydXNhJFllYXIgPjE5NzJdIDwtIFRSVUUKCiNzZWNvbmQgd2F2ZQpydXNhJGlzLmV1W3J1c2EkQ291bnRyeT09ICJHUkMiICYgcnVzYSRZZWFyID4xOTgwXSA8LSBUUlVFCgojdGhpcmQgd2F2ZQpydXNhJGlzLmV1W3J1c2EkQ291bnRyeT09ICJFU1AiICYgcnVzYSRZZWFyID4xOTg1XSA8LSBUUlVFCnJ1c2EkaXMuZXVbcnVzYSRDb3VudHJ5PT0gIlBSVCIgJiBydXNhJFllYXIgPjE5ODVdIDwtIFRSVUUKCiNmb3VydGggd2F2ZQpydXNhJGlzLmV1W3J1c2EkQ291bnRyeT09ICJBVVQiICYgcnVzYSRZZWFyID4xOTk0XSA8LSBUUlVFCnJ1c2EkaXMuZXVbcnVzYSRDb3VudHJ5PT0gIkZJTiIgJiBydXNhJFllYXIgPjE5OTRdIDwtIFRSVUUKcnVzYSRpcy5ldVtydXNhJENvdW50cnk9PSAiU1dFIiAmIHJ1c2EkWWVhciA+MTk5NF0gPC0gVFJVRQoKI2ZpZnRoIHdhdmUKcnVzYSRpcy5ldVtydXNhJENvdW50cnk9PSAiQ1pFIiAmIHJ1c2EkWWVhciA+MjAwM10gPC0gVFJVRQpydXNhJGlzLmV1W3J1c2EkQ291bnRyeT09ICJIVU4iICYgcnVzYSRZZWFyID4yMDAzXSA8LSBUUlVFCnJ1c2EkaXMuZXVbcnVzYSRDb3VudHJ5PT0gIlBPTCIgJiBydXNhJFllYXIgPjIwMDNdIDwtIFRSVUUKcnVzYSRpcy5ldVtydXNhJENvdW50cnk9PSAiRVNUIiAmIHJ1c2EkWWVhciA+MjAwM10gPC0gVFJVRQpydXNhJGlzLmV1W3J1c2EkQ291bnRyeT09ICJMVkEiICYgcnVzYSRZZWFyID4yMDAzXSA8LSBUUlVFCnJ1c2EkaXMuZXVbcnVzYSRDb3VudHJ5PT0gIkxUVSIgJiBydXNhJFllYXIgPjIwMDNdIDwtIFRSVUUKcnVzYSRpcy5ldVtydXNhJENvdW50cnk9PSAiQ1lQIiAmIHJ1c2EkWWVhciA+MjAwM10gPC0gVFJVRQpydXNhJGlzLmV1W3J1c2EkQ291bnRyeT09ICJNTFQiICYgcnVzYSRZZWFyID4yMDAzXSA8LSBUUlVFCnJ1c2EkaXMuZXVbcnVzYSRDb3VudHJ5PT0gIlNWSyIgJiBydXNhJFllYXIgPjIwMDNdIDwtIFRSVUUKcnVzYSRpcy5ldVtydXNhJENvdW50cnk9PSAiU1ZOIiAmIHJ1c2EkWWVhciA+MjAwM10gPC0gVFJVRQoKI3NpeHRoIHdhdmUKcnVzYSRpcy5ldVtydXNhJENvdW50cnk9PSAiQkdSIiAmIHJ1c2EkWWVhciA+MjAwNl0gPC0gVFJVRQpydXNhJGlzLmV1W3J1c2EkQ291bnRyeT09ICJST1UiICYgcnVzYSRZZWFyID4yMDA2XSA8LSBUUlVFCgojc2V2ZW50aCB3YXZlCnJ1c2EkaXMuZXVbcnVzYSRDb3VudHJ5PT0gIkhSViIgJiBydXNhJFllYXIgPjIwMTJdIDwtIFRSVUUKYGBgCgoKYGBge3J9CiNUaGUgc2FtZSBmb3IgdGhlIENoaW5hLVVTIGRpbWVuc2lvbjoKCmNobnVzYSA8LSBjaG51c2EgJT4lIG11dGF0ZShpcy5ldSA9IENvdW50cnkgJWluJSBFVSkKCiNmaXJzdCB3YXZlCmNobnVzYSRpcy5ldVtjaG51c2EkQ291bnRyeT09ICJETksiICYgY2hudXNhJFllYXIgPjE5NzJdIDwtIFRSVUUKY2hudXNhJGlzLmV1W2NobnVzYSRDb3VudHJ5PT0gIklSTCIgJiBjaG51c2EkWWVhciA+MTk3Ml0gPC0gVFJVRQpjaG51c2EkaXMuZXVbY2hudXNhJENvdW50cnk9PSAiR0JSIiAmIGNobnVzYSRZZWFyID4xOTcyXSA8LSBUUlVFCgojc2Vjb25kIHdhdmUKY2hudXNhJGlzLmV1W2NobnVzYSRDb3VudHJ5PT0gIkdSQyIgJiBjaG51c2EkWWVhciA+MTk4MF0gPC0gVFJVRQoKI3RoaXJkIHdhdmUKY2hudXNhJGlzLmV1W2NobnVzYSRDb3VudHJ5PT0gIkVTUCIgJiBjaG51c2EkWWVhciA+MTk4NV0gPC0gVFJVRQpjaG51c2EkaXMuZXVbY2hudXNhJENvdW50cnk9PSAiUFJUIiAmIGNobnVzYSRZZWFyID4xOTg1XSA8LSBUUlVFCgojZm91cnRoIHdhdmUKY2hudXNhJGlzLmV1W2NobnVzYSRDb3VudHJ5PT0gIkFVVCIgJiBjaG51c2EkWWVhciA+MTk5NF0gPC0gVFJVRQpjaG51c2EkaXMuZXVbY2hudXNhJENvdW50cnk9PSAiRklOIiAmIGNobnVzYSRZZWFyID4xOTk0XSA8LSBUUlVFCmNobnVzYSRpcy5ldVtjaG51c2EkQ291bnRyeT09ICJTV0UiICYgY2hudXNhJFllYXIgPjE5OTRdIDwtIFRSVUUKCiNmaWZ0aCB3YXZlCmNobnVzYSRpcy5ldVtjaG51c2EkQ291bnRyeT09ICJDWkUiICYgY2hudXNhJFllYXIgPjIwMDNdIDwtIFRSVUUKY2hudXNhJGlzLmV1W2NobnVzYSRDb3VudHJ5PT0gIkhVTiIgJiBjaG51c2EkWWVhciA+MjAwM10gPC0gVFJVRQpjaG51c2EkaXMuZXVbY2hudXNhJENvdW50cnk9PSAiUE9MIiAmIGNobnVzYSRZZWFyID4yMDAzXSA8LSBUUlVFCmNobnVzYSRpcy5ldVtjaG51c2EkQ291bnRyeT09ICJFU1QiICYgY2hudXNhJFllYXIgPjIwMDNdIDwtIFRSVUUKY2hudXNhJGlzLmV1W2NobnVzYSRDb3VudHJ5PT0gIkxWQSIgJiBjaG51c2EkWWVhciA+MjAwM10gPC0gVFJVRQpjaG51c2EkaXMuZXVbY2hudXNhJENvdW50cnk9PSAiTFRVIiAmIGNobnVzYSRZZWFyID4yMDAzXSA8LSBUUlVFCmNobnVzYSRpcy5ldVtjaG51c2EkQ291bnRyeT09ICJDWVAiICYgY2hudXNhJFllYXIgPjIwMDNdIDwtIFRSVUUKY2hudXNhJGlzLmV1W2NobnVzYSRDb3VudHJ5PT0gIk1MVCIgJiBjaG51c2EkWWVhciA+MjAwM10gPC0gVFJVRQpjaG51c2EkaXMuZXVbY2hudXNhJENvdW50cnk9PSAiU1ZLIiAmIGNobnVzYSRZZWFyID4yMDAzXSA8LSBUUlVFCmNobnVzYSRpcy5ldVtjaG51c2EkQ291bnRyeT09ICJTVk4iICYgY2hudXNhJFllYXIgPjIwMDNdIDwtIFRSVUUKCiNzaXh0aCB3YXZlCmNobnVzYSRpcy5ldVtjaG51c2EkQ291bnRyeT09ICJCR1IiICYgY2hudXNhJFllYXIgPjIwMDZdIDwtIFRSVUUKY2hudXNhJGlzLmV1W2NobnVzYSRDb3VudHJ5PT0gIlJPVSIgJiBjaG51c2EkWWVhciA+MjAwNl0gPC0gVFJVRQoKI3NldmVudGggd2F2ZQpjaG51c2EkaXMuZXVbY2hudXNhJENvdW50cnk9PSAiSFJWIiAmIGNobnVzYSRZZWFyID4yMDEyXSA8LSBUUlVFCmBgYAoKCmBgYHtyfQpkZXJ1cyA8LSBkZXJ1cyAlPiUgbXV0YXRlKGlzLmV1ID0gQ291bnRyeSAlaW4lIEVVKQoKI2ZpcnN0IHdhdmUKZGVydXMkaXMuZXVbZGVydXMkQ291bnRyeT09ICJETksiICYgZGVydXMkWWVhciA+MTk3Ml0gPC0gVFJVRQpkZXJ1cyRpcy5ldVtkZXJ1cyRDb3VudHJ5PT0gIklSTCIgJiBkZXJ1cyRZZWFyID4xOTcyXSA8LSBUUlVFCmRlcnVzJGlzLmV1W2RlcnVzJENvdW50cnk9PSAiR0JSIiAmIGRlcnVzJFllYXIgPjE5NzJdIDwtIFRSVUUKCiNzZWNvbmQgd2F2ZQpkZXJ1cyRpcy5ldVtkZXJ1cyRDb3VudHJ5PT0gIkdSQyIgJiBkZXJ1cyRZZWFyID4xOTgwXSA8LSBUUlVFCgojdGhpcmQgd2F2ZQpkZXJ1cyRpcy5ldVtkZXJ1cyRDb3VudHJ5PT0gIkVTUCIgJiBkZXJ1cyRZZWFyID4xOTg1XSA8LSBUUlVFCmRlcnVzJGlzLmV1W2RlcnVzJENvdW50cnk9PSAiUFJUIiAmIGRlcnVzJFllYXIgPjE5ODVdIDwtIFRSVUUKCiNmb3VydGggd2F2ZQpkZXJ1cyRpcy5ldVtkZXJ1cyRDb3VudHJ5PT0gIkFVVCIgJiBkZXJ1cyRZZWFyID4xOTk0XSA8LSBUUlVFCmRlcnVzJGlzLmV1W2RlcnVzJENvdW50cnk9PSAiRklOIiAmIGRlcnVzJFllYXIgPjE5OTRdIDwtIFRSVUUKZGVydXMkaXMuZXVbZGVydXMkQ291bnRyeT09ICJTV0UiICYgZGVydXMkWWVhciA+MTk5NF0gPC0gVFJVRQoKI2ZpZnRoIHdhdmUKZGVydXMkaXMuZXVbZGVydXMkQ291bnRyeT09ICJDWkUiICYgZGVydXMkWWVhciA+MjAwM10gPC0gVFJVRQpkZXJ1cyRpcy5ldVtkZXJ1cyRDb3VudHJ5PT0gIkhVTiIgJiBkZXJ1cyRZZWFyID4yMDAzXSA8LSBUUlVFCmRlcnVzJGlzLmV1W2RlcnVzJENvdW50cnk9PSAiUE9MIiAmIGRlcnVzJFllYXIgPjIwMDNdIDwtIFRSVUUKZGVydXMkaXMuZXVbZGVydXMkQ291bnRyeT09ICJFU1QiICYgZGVydXMkWWVhciA+MjAwM10gPC0gVFJVRQpkZXJ1cyRpcy5ldVtkZXJ1cyRDb3VudHJ5PT0gIkxWQSIgJiBkZXJ1cyRZZWFyID4yMDAzXSA8LSBUUlVFCmRlcnVzJGlzLmV1W2RlcnVzJENvdW50cnk9PSAiTFRVIiAmIGRlcnVzJFllYXIgPjIwMDNdIDwtIFRSVUUKZGVydXMkaXMuZXVbZGVydXMkQ291bnRyeT09ICJDWVAiICYgZGVydXMkWWVhciA+MjAwM10gPC0gVFJVRQpkZXJ1cyRpcy5ldVtkZXJ1cyRDb3VudHJ5PT0gIk1MVCIgJiBkZXJ1cyRZZWFyID4yMDAzXSA8LSBUUlVFCmRlcnVzJGlzLmV1W2RlcnVzJENvdW50cnk9PSAiU1ZLIiAmIGRlcnVzJFllYXIgPjIwMDNdIDwtIFRSVUUKZGVydXMkaXMuZXVbZGVydXMkQ291bnRyeT09ICJTVk4iICYgZGVydXMkWWVhciA+MjAwM10gPC0gVFJVRQoKI3NpeHRoIHdhdmUKZGVydXMkaXMuZXVbZGVydXMkQ291bnRyeT09ICJCR1IiICYgZGVydXMkWWVhciA+MjAwNl0gPC0gVFJVRQpkZXJ1cyRpcy5ldVtkZXJ1cyRDb3VudHJ5PT0gIlJPVSIgJiBkZXJ1cyRZZWFyID4yMDA2XSA8LSBUUlVFCgojc2V2ZW50aCB3YXZlCmRlcnVzJGlzLmV1W2RlcnVzJENvdW50cnk9PSAiSFJWIiAmIGRlcnVzJFllYXIgPjIwMTJdIDwtIFRSVUUKYGBgCgoKCmBgYHtyfQpkZXVzYSA8LSBkZXVzYSAlPiUgbXV0YXRlKGlzLmV1ID0gQ291bnRyeSAlaW4lIEVVKQoKI2ZpcnN0IHdhdmUKZGV1c2EkaXMuZXVbZGV1c2EkQ291bnRyeT09ICJETksiICYgZGV1c2EkWWVhciA+MTk3Ml0gPC0gVFJVRQpkZXVzYSRpcy5ldVtkZXVzYSRDb3VudHJ5PT0gIklSTCIgJiBkZXVzYSRZZWFyID4xOTcyXSA8LSBUUlVFCmRldXNhJGlzLmV1W2RldXNhJENvdW50cnk9PSAiR0JSIiAmIGRldXNhJFllYXIgPjE5NzJdIDwtIFRSVUUKCiNzZWNvbmQgd2F2ZQpkZXVzYSRpcy5ldVtkZXVzYSRDb3VudHJ5PT0gIkdSQyIgJiBkZXVzYSRZZWFyID4xOTgwXSA8LSBUUlVFCgojdGhpcmQgd2F2ZQpkZXVzYSRpcy5ldVtkZXVzYSRDb3VudHJ5PT0gIkVTUCIgJiBkZXVzYSRZZWFyID4xOTg1XSA8LSBUUlVFCmRldXNhJGlzLmV1W2RldXNhJENvdW50cnk9PSAiUFJUIiAmIGRldXNhJFllYXIgPjE5ODVdIDwtIFRSVUUKCiNmb3VydGggd2F2ZQpkZXVzYSRpcy5ldVtkZXVzYSRDb3VudHJ5PT0gIkFVVCIgJiBkZXVzYSRZZWFyID4xOTk0XSA8LSBUUlVFCmRldXNhJGlzLmV1W2RldXNhJENvdW50cnk9PSAiRklOIiAmIGRldXNhJFllYXIgPjE5OTRdIDwtIFRSVUUKZGV1c2EkaXMuZXVbZGV1c2EkQ291bnRyeT09ICJTV0UiICYgZGV1c2EkWWVhciA+MTk5NF0gPC0gVFJVRQoKI2ZpZnRoIHdhdmUKZGV1c2EkaXMuZXVbZGV1c2EkQ291bnRyeT09ICJDWkUiICYgZGV1c2EkWWVhciA+MjAwM10gPC0gVFJVRQpkZXVzYSRpcy5ldVtkZXVzYSRDb3VudHJ5PT0gIkhVTiIgJiBkZXVzYSRZZWFyID4yMDAzXSA8LSBUUlVFCmRldXNhJGlzLmV1W2RldXNhJENvdW50cnk9PSAiUE9MIiAmIGRldXNhJFllYXIgPjIwMDNdIDwtIFRSVUUKZGV1c2EkaXMuZXVbZGV1c2EkQ291bnRyeT09ICJFU1QiICYgZGV1c2EkWWVhciA+MjAwM10gPC0gVFJVRQpkZXVzYSRpcy5ldVtkZXVzYSRDb3VudHJ5PT0gIkxWQSIgJiBkZXVzYSRZZWFyID4yMDAzXSA8LSBUUlVFCmRldXNhJGlzLmV1W2RldXNhJENvdW50cnk9PSAiTFRVIiAmIGRldXNhJFllYXIgPjIwMDNdIDwtIFRSVUUKZGV1c2EkaXMuZXVbZGV1c2EkQ291bnRyeT09ICJDWVAiICYgZGV1c2EkWWVhciA+MjAwM10gPC0gVFJVRQpkZXVzYSRpcy5ldVtkZXVzYSRDb3VudHJ5PT0gIk1MVCIgJiBkZXVzYSRZZWFyID4yMDAzXSA8LSBUUlVFCmRldXNhJGlzLmV1W2RldXNhJENvdW50cnk9PSAiU1ZLIiAmIGRldXNhJFllYXIgPjIwMDNdIDwtIFRSVUUKZGV1c2EkaXMuZXVbZGV1c2EkQ291bnRyeT09ICJTVk4iICYgZGV1c2EkWWVhciA+MjAwM10gPC0gVFJVRQoKI3NpeHRoIHdhdmUKZGV1c2EkaXMuZXVbZGV1c2EkQ291bnRyeT09ICJCR1IiICYgZGV1c2EkWWVhciA+MjAwNl0gPC0gVFJVRQpkZXVzYSRpcy5ldVtkZXVzYSRDb3VudHJ5PT0gIlJPVSIgJiBkZXVzYSRZZWFyID4yMDA2XSA8LSBUUlVFCgojc2V2ZW50aCB3YXZlCmRldXNhJGlzLmV1W2RldXNhJENvdW50cnk9PSAiSFJWIiAmIGRldXNhJFllYXIgPjIwMTJdIDwtIFRSVUUKCmBgYAoKCmBgYHtyfQpsdXhlcnVzIDwtIGx1eGVydXMgJT4lIG11dGF0ZShpcy5ldSA9IENvdW50cnkgJWluJSBFVSkKCiNmaXJzdCB3YXZlCmx1eGVydXMkaXMuZXVbbHV4ZXJ1cyRDb3VudHJ5PT0gIkROSyIgJiBsdXhlcnVzJFllYXIgPjE5NzJdIDwtIFRSVUUKbHV4ZXJ1cyRpcy5ldVtsdXhlcnVzJENvdW50cnk9PSAiSVJMIiAmIGx1eGVydXMkWWVhciA+MTk3Ml0gPC0gVFJVRQpsdXhlcnVzJGlzLmV1W2x1eGVydXMkQ291bnRyeT09ICJHQlIiICYgbHV4ZXJ1cyRZZWFyID4xOTcyXSA8LSBUUlVFCgojc2Vjb25kIHdhdmUKbHV4ZXJ1cyRpcy5ldVtsdXhlcnVzJENvdW50cnk9PSAiR1JDIiAmIGx1eGVydXMkWWVhciA+MTk4MF0gPC0gVFJVRQoKI3RoaXJkIHdhdmUKbHV4ZXJ1cyRpcy5ldVtsdXhlcnVzJENvdW50cnk9PSAiRVNQIiAmIGx1eGVydXMkWWVhciA+MTk4NV0gPC0gVFJVRQpsdXhlcnVzJGlzLmV1W2x1eGVydXMkQ291bnRyeT09ICJQUlQiICYgbHV4ZXJ1cyRZZWFyID4xOTg1XSA8LSBUUlVFCgojZm91cnRoIHdhdmUKbHV4ZXJ1cyRpcy5ldVtsdXhlcnVzJENvdW50cnk9PSAiQVVUIiAmIGx1eGVydXMkWWVhciA+MTk5NF0gPC0gVFJVRQpsdXhlcnVzJGlzLmV1W2x1eGVydXMkQ291bnRyeT09ICJGSU4iICYgbHV4ZXJ1cyRZZWFyID4xOTk0XSA8LSBUUlVFCmx1eGVydXMkaXMuZXVbbHV4ZXJ1cyRDb3VudHJ5PT0gIlNXRSIgJiBsdXhlcnVzJFllYXIgPjE5OTRdIDwtIFRSVUUKCiNmaWZ0aCB3YXZlCmx1eGVydXMkaXMuZXVbbHV4ZXJ1cyRDb3VudHJ5PT0gIkNaRSIgJiBsdXhlcnVzJFllYXIgPjIwMDNdIDwtIFRSVUUKbHV4ZXJ1cyRpcy5ldVtsdXhlcnVzJENvdW50cnk9PSAiSFVOIiAmIGx1eGVydXMkWWVhciA+MjAwM10gPC0gVFJVRQpsdXhlcnVzJGlzLmV1W2x1eGVydXMkQ291bnRyeT09ICJQT0wiICYgbHV4ZXJ1cyRZZWFyID4yMDAzXSA8LSBUUlVFCmx1eGVydXMkaXMuZXVbbHV4ZXJ1cyRDb3VudHJ5PT0gIkVTVCIgJiBsdXhlcnVzJFllYXIgPjIwMDNdIDwtIFRSVUUKbHV4ZXJ1cyRpcy5ldVtsdXhlcnVzJENvdW50cnk9PSAiTFZBIiAmIGx1eGVydXMkWWVhciA+MjAwM10gPC0gVFJVRQpsdXhlcnVzJGlzLmV1W2x1eGVydXMkQ291bnRyeT09ICJMVFUiICYgbHV4ZXJ1cyRZZWFyID4yMDAzXSA8LSBUUlVFCmx1eGVydXMkaXMuZXVbbHV4ZXJ1cyRDb3VudHJ5PT0gIkNZUCIgJiBsdXhlcnVzJFllYXIgPjIwMDNdIDwtIFRSVUUKbHV4ZXJ1cyRpcy5ldVtsdXhlcnVzJENvdW50cnk9PSAiTUxUIiAmIGx1eGVydXMkWWVhciA+MjAwM10gPC0gVFJVRQpsdXhlcnVzJGlzLmV1W2x1eGVydXMkQ291bnRyeT09ICJTVksiICYgbHV4ZXJ1cyRZZWFyID4yMDAzXSA8LSBUUlVFCmx1eGVydXMkaXMuZXVbbHV4ZXJ1cyRDb3VudHJ5PT0gIlNWTiIgJiBsdXhlcnVzJFllYXIgPjIwMDNdIDwtIFRSVUUKCiNzaXh0aCB3YXZlCmx1eGVydXMkaXMuZXVbbHV4ZXJ1cyRDb3VudHJ5PT0gIkJHUiIgJiBsdXhlcnVzJFllYXIgPjIwMDZdIDwtIFRSVUUKbHV4ZXJ1cyRpcy5ldVtsdXhlcnVzJENvdW50cnk9PSAiUk9VIiAmIGx1eGVydXMkWWVhciA+MjAwNl0gPC0gVFJVRQoKI3NldmVudGggd2F2ZQpsdXhlcnVzJGlzLmV1W2x1eGVydXMkQ291bnRyeT09ICJIUlYiICYgbHV4ZXJ1cyRZZWFyID4yMDEyXSA8LSBUUlVFCgpgYGAKCgpgYGB7cn0KbHV4dXMgPC0gbHV4dXMgJT4lIG11dGF0ZShpcy5ldSA9IENvdW50cnkgJWluJSBFVSkKCiNmaXJzdCB3YXZlCmx1eHVzJGlzLmV1W2x1eHVzJENvdW50cnk9PSAiRE5LIiAmIGx1eHVzJFllYXIgPjE5NzJdIDwtIFRSVUUKbHV4dXMkaXMuZXVbbHV4dXMkQ291bnRyeT09ICJJUkwiICYgbHV4dXMkWWVhciA+MTk3Ml0gPC0gVFJVRQpsdXh1cyRpcy5ldVtsdXh1cyRDb3VudHJ5PT0gIkdCUiIgJiBsdXh1cyRZZWFyID4xOTcyXSA8LSBUUlVFCgojc2Vjb25kIHdhdmUKbHV4dXMkaXMuZXVbbHV4dXMkQ291bnRyeT09ICJHUkMiICYgbHV4dXMkWWVhciA+MTk4MF0gPC0gVFJVRQoKI3RoaXJkIHdhdmUKbHV4dXMkaXMuZXVbbHV4dXMkQ291bnRyeT09ICJFU1AiICYgbHV4dXMkWWVhciA+MTk4NV0gPC0gVFJVRQpsdXh1cyRpcy5ldVtsdXh1cyRDb3VudHJ5PT0gIlBSVCIgJiBsdXh1cyRZZWFyID4xOTg1XSA8LSBUUlVFCgojZm91cnRoIHdhdmUKbHV4dXMkaXMuZXVbbHV4dXMkQ291bnRyeT09ICJBVVQiICYgbHV4dXMkWWVhciA+MTk5NF0gPC0gVFJVRQpsdXh1cyRpcy5ldVtsdXh1cyRDb3VudHJ5PT0gIkZJTiIgJiBsdXh1cyRZZWFyID4xOTk0XSA8LSBUUlVFCmx1eHVzJGlzLmV1W2x1eHVzJENvdW50cnk9PSAiU1dFIiAmIGx1eHVzJFllYXIgPjE5OTRdIDwtIFRSVUUKCiNmaWZ0aCB3YXZlCmx1eHVzJGlzLmV1W2x1eHVzJENvdW50cnk9PSAiQ1pFIiAmIGx1eHVzJFllYXIgPjIwMDNdIDwtIFRSVUUKbHV4dXMkaXMuZXVbbHV4dXMkQ291bnRyeT09ICJIVU4iICYgbHV4dXMkWWVhciA+MjAwM10gPC0gVFJVRQpsdXh1cyRpcy5ldVtsdXh1cyRDb3VudHJ5PT0gIlBPTCIgJiBsdXh1cyRZZWFyID4yMDAzXSA8LSBUUlVFCmx1eHVzJGlzLmV1W2x1eHVzJENvdW50cnk9PSAiRVNUIiAmIGx1eHVzJFllYXIgPjIwMDNdIDwtIFRSVUUKbHV4dXMkaXMuZXVbbHV4dXMkQ291bnRyeT09ICJMVkEiICYgbHV4dXMkWWVhciA+MjAwM10gPC0gVFJVRQpsdXh1cyRpcy5ldVtsdXh1cyRDb3VudHJ5PT0gIkxUVSIgJiBsdXh1cyRZZWFyID4yMDAzXSA8LSBUUlVFCmx1eHVzJGlzLmV1W2x1eHVzJENvdW50cnk9PSAiQ1lQIiAmIGx1eHVzJFllYXIgPjIwMDNdIDwtIFRSVUUKbHV4dXMkaXMuZXVbbHV4dXMkQ291bnRyeT09ICJNTFQiICYgbHV4dXMkWWVhciA+MjAwM10gPC0gVFJVRQpsdXh1cyRpcy5ldVtsdXh1cyRDb3VudHJ5PT0gIlNWSyIgJiBsdXh1cyRZZWFyID4yMDAzXSA8LSBUUlVFCmx1eHVzJGlzLmV1W2x1eHVzJENvdW50cnk9PSAiU1ZOIiAmIGx1eHVzJFllYXIgPjIwMDNdIDwtIFRSVUUKCiNzaXh0aCB3YXZlCmx1eHVzJGlzLmV1W2x1eHVzJENvdW50cnk9PSAiQkdSIiAmIGx1eHVzJFllYXIgPjIwMDZdIDwtIFRSVUUKbHV4dXMkaXMuZXVbbHV4dXMkQ291bnRyeT09ICJST1UiICYgbHV4dXMkWWVhciA+MjAwNl0gPC0gVFJVRQoKI3NldmVudGggd2F2ZQpsdXh1cyRpcy5ldVtsdXh1cyRDb3VudHJ5PT0gIkhSViIgJiBsdXh1cyRZZWFyID4yMDEyXSA8LSBUUlVFCmBgYAoKCmBgYHtyfQpwYWwgPC0gcGFsICU+JSBtdXRhdGUoaXMuZXUgPSBDb3VudHJ5ICVpbiUgRVUpCgojZmlyc3Qgd2F2ZQpwYWwkaXMuZXVbcGFsJENvdW50cnk9PSAiRE5LIiAmIHBhbCRZZWFyID4xOTcyXSA8LSBUUlVFCnBhbCRpcy5ldVtwYWwkQ291bnRyeT09ICJJUkwiICYgcGFsJFllYXIgPjE5NzJdIDwtIFRSVUUKcGFsJGlzLmV1W3BhbCRDb3VudHJ5PT0gIkdCUiIgJiBwYWwkWWVhciA+MTk3Ml0gPC0gVFJVRQoKI3NlY29uZCB3YXZlCnBhbCRpcy5ldVtwYWwkQ291bnRyeT09ICJHUkMiICYgcGFsJFllYXIgPjE5ODBdIDwtIFRSVUUKCiN0aGlyZCB3YXZlCnBhbCRpcy5ldVtwYWwkQ291bnRyeT09ICJFU1AiICYgcGFsJFllYXIgPjE5ODVdIDwtIFRSVUUKcGFsJGlzLmV1W3BhbCRDb3VudHJ5PT0gIlBSVCIgJiBwYWwkWWVhciA+MTk4NV0gPC0gVFJVRQoKI2ZvdXJ0aCB3YXZlCnBhbCRpcy5ldVtwYWwkQ291bnRyeT09ICJBVVQiICYgcGFsJFllYXIgPjE5OTRdIDwtIFRSVUUKcGFsJGlzLmV1W3BhbCRDb3VudHJ5PT0gIkZJTiIgJiBwYWwkWWVhciA+MTk5NF0gPC0gVFJVRQpwYWwkaXMuZXVbcGFsJENvdW50cnk9PSAiU1dFIiAmIHBhbCRZZWFyID4xOTk0XSA8LSBUUlVFCgojZmlmdGggd2F2ZQpwYWwkaXMuZXVbcGFsJENvdW50cnk9PSAiQ1pFIiAmIHBhbCRZZWFyID4yMDAzXSA8LSBUUlVFCnBhbCRpcy5ldVtwYWwkQ291bnRyeT09ICJIVU4iICYgcGFsJFllYXIgPjIwMDNdIDwtIFRSVUUKcGFsJGlzLmV1W3BhbCRDb3VudHJ5PT0gIlBPTCIgJiBwYWwkWWVhciA+MjAwM10gPC0gVFJVRQpwYWwkaXMuZXVbcGFsJENvdW50cnk9PSAiRVNUIiAmIHBhbCRZZWFyID4yMDAzXSA8LSBUUlVFCnBhbCRpcy5ldVtwYWwkQ291bnRyeT09ICJMVkEiICYgcGFsJFllYXIgPjIwMDNdIDwtIFRSVUUKcGFsJGlzLmV1W3BhbCRDb3VudHJ5PT0gIkxUVSIgJiBwYWwkWWVhciA+MjAwM10gPC0gVFJVRQpwYWwkaXMuZXVbcGFsJENvdW50cnk9PSAiQ1lQIiAmIHBhbCRZZWFyID4yMDAzXSA8LSBUUlVFCnBhbCRpcy5ldVtwYWwkQ291bnRyeT09ICJNTFQiICYgcGFsJFllYXIgPjIwMDNdIDwtIFRSVUUKcGFsJGlzLmV1W3BhbCRDb3VudHJ5PT0gIlNWSyIgJiBwYWwkWWVhciA+MjAwM10gPC0gVFJVRQpwYWwkaXMuZXVbcGFsJENvdW50cnk9PSAiU1ZOIiAmIHBhbCRZZWFyID4yMDAzXSA8LSBUUlVFCgojc2l4dGggd2F2ZQpwYWwkaXMuZXVbcGFsJENvdW50cnk9PSAiQkdSIiAmIHBhbCRZZWFyID4yMDA2XSA8LSBUUlVFCnBhbCRpcy5ldVtwYWwkQ291bnRyeT09ICJST1UiICYgcGFsJFllYXIgPjIwMDZdIDwtIFRSVUUKCiNzZXZlbnRoIHdhdmUKcGFsJGlzLmV1W3BhbCRDb3VudHJ5PT0gIkhSViIgJiBwYWwkWWVhciA+MjAxMl0gPC0gVFJVRQoKYGBgCgoKYGBge3J9CnByZXN1cyA8LSBwcmVzdXMgJT4lIG11dGF0ZShpcy5ldSA9IENvdW50cnkgJWluJSBFVSkKCiNmaXJzdCB3YXZlCnByZXN1cyRpcy5ldVtwcmVzdXMkQ291bnRyeT09ICJETksiICYgcHJlc3VzJFllYXIgPjE5NzJdIDwtIFRSVUUKcHJlc3VzJGlzLmV1W3ByZXN1cyRDb3VudHJ5PT0gIklSTCIgJiBwcmVzdXMkWWVhciA+MTk3Ml0gPC0gVFJVRQpwcmVzdXMkaXMuZXVbcHJlc3VzJENvdW50cnk9PSAiR0JSIiAmIHByZXN1cyRZZWFyID4xOTcyXSA8LSBUUlVFCgojc2Vjb25kIHdhdmUKcHJlc3VzJGlzLmV1W3ByZXN1cyRDb3VudHJ5PT0gIkdSQyIgJiBwcmVzdXMkWWVhciA+MTk4MF0gPC0gVFJVRQoKI3RoaXJkIHdhdmUKcHJlc3VzJGlzLmV1W3ByZXN1cyRDb3VudHJ5PT0gIkVTUCIgJiBwcmVzdXMkWWVhciA+MTk4NV0gPC0gVFJVRQpwcmVzdXMkaXMuZXVbcHJlc3VzJENvdW50cnk9PSAiUFJUIiAmIHByZXN1cyRZZWFyID4xOTg1XSA8LSBUUlVFCgojZm91cnRoIHdhdmUKcHJlc3VzJGlzLmV1W3ByZXN1cyRDb3VudHJ5PT0gIkFVVCIgJiBwcmVzdXMkWWVhciA+MTk5NF0gPC0gVFJVRQpwcmVzdXMkaXMuZXVbcHJlc3VzJENvdW50cnk9PSAiRklOIiAmIHByZXN1cyRZZWFyID4xOTk0XSA8LSBUUlVFCnByZXN1cyRpcy5ldVtwcmVzdXMkQ291bnRyeT09ICJTV0UiICYgcHJlc3VzJFllYXIgPjE5OTRdIDwtIFRSVUUKCiNmaWZ0aCB3YXZlCnByZXN1cyRpcy5ldVtwcmVzdXMkQ291bnRyeT09ICJDWkUiICYgcHJlc3VzJFllYXIgPjIwMDNdIDwtIFRSVUUKcHJlc3VzJGlzLmV1W3ByZXN1cyRDb3VudHJ5PT0gIkhVTiIgJiBwcmVzdXMkWWVhciA+MjAwM10gPC0gVFJVRQpwcmVzdXMkaXMuZXVbcHJlc3VzJENvdW50cnk9PSAiUE9MIiAmIHByZXN1cyRZZWFyID4yMDAzXSA8LSBUUlVFCnByZXN1cyRpcy5ldVtwcmVzdXMkQ291bnRyeT09ICJFU1QiICYgcHJlc3VzJFllYXIgPjIwMDNdIDwtIFRSVUUKcHJlc3VzJGlzLmV1W3ByZXN1cyRDb3VudHJ5PT0gIkxWQSIgJiBwcmVzdXMkWWVhciA+MjAwM10gPC0gVFJVRQpwcmVzdXMkaXMuZXVbcHJlc3VzJENvdW50cnk9PSAiTFRVIiAmIHByZXN1cyRZZWFyID4yMDAzXSA8LSBUUlVFCnByZXN1cyRpcy5ldVtwcmVzdXMkQ291bnRyeT09ICJDWVAiICYgcHJlc3VzJFllYXIgPjIwMDNdIDwtIFRSVUUKcHJlc3VzJGlzLmV1W3ByZXN1cyRDb3VudHJ5PT0gIk1MVCIgJiBwcmVzdXMkWWVhciA+MjAwM10gPC0gVFJVRQpwcmVzdXMkaXMuZXVbcHJlc3VzJENvdW50cnk9PSAiU1ZLIiAmIHByZXN1cyRZZWFyID4yMDAzXSA8LSBUUlVFCnByZXN1cyRpcy5ldVtwcmVzdXMkQ291bnRyeT09ICJTVk4iICYgcHJlc3VzJFllYXIgPjIwMDNdIDwtIFRSVUUKCiNzaXh0aCB3YXZlCnByZXN1cyRpcy5ldVtwcmVzdXMkQ291bnRyeT09ICJCR1IiICYgcHJlc3VzJFllYXIgPjIwMDZdIDwtIFRSVUUKcHJlc3VzJGlzLmV1W3ByZXN1cyRDb3VudHJ5PT0gIlJPVSIgJiBwcmVzdXMkWWVhciA+MjAwNl0gPC0gVFJVRQoKI3NldmVudGggd2F2ZQpwcmVzdXMkaXMuZXVbcHJlc3VzJENvdW50cnk9PSAiSFJWIiAmIHByZXN1cyRZZWFyID4yMDEyXSA8LSBUUlVFCmBgYAoKCmBgYHtyfQpwcmVzdXNhbHQgPC0gcHJlc3VzYWx0ICU+JSBtdXRhdGUoaXMuZXUgPSBDb3VudHJ5ICVpbiUgRVUpCgojZmlyc3Qgd2F2ZQpwcmVzdXNhbHQkaXMuZXVbcHJlc3VzYWx0JENvdW50cnk9PSAiRE5LIiAmIHByZXN1c2FsdCRZZWFyID4xOTcyXSA8LSBUUlVFCnByZXN1c2FsdCRpcy5ldVtwcmVzdXNhbHQkQ291bnRyeT09ICJJUkwiICYgcHJlc3VzYWx0JFllYXIgPjE5NzJdIDwtIFRSVUUKcHJlc3VzYWx0JGlzLmV1W3ByZXN1c2FsdCRDb3VudHJ5PT0gIkdCUiIgJiBwcmVzdXNhbHQkWWVhciA+MTk3Ml0gPC0gVFJVRQoKI3NlY29uZCB3YXZlCnByZXN1c2FsdCRpcy5ldVtwcmVzdXNhbHQkQ291bnRyeT09ICJHUkMiICYgcHJlc3VzYWx0JFllYXIgPjE5ODBdIDwtIFRSVUUKCiN0aGlyZCB3YXZlCnByZXN1c2FsdCRpcy5ldVtwcmVzdXNhbHQkQ291bnRyeT09ICJFU1AiICYgcHJlc3VzYWx0JFllYXIgPjE5ODVdIDwtIFRSVUUKcHJlc3VzYWx0JGlzLmV1W3ByZXN1c2FsdCRDb3VudHJ5PT0gIlBSVCIgJiBwcmVzdXNhbHQkWWVhciA+MTk4NV0gPC0gVFJVRQoKI2ZvdXJ0aCB3YXZlCnByZXN1c2FsdCRpcy5ldVtwcmVzdXNhbHQkQ291bnRyeT09ICJBVVQiICYgcHJlc3VzYWx0JFllYXIgPjE5OTRdIDwtIFRSVUUKcHJlc3VzYWx0JGlzLmV1W3ByZXN1c2FsdCRDb3VudHJ5PT0gIkZJTiIgJiBwcmVzdXNhbHQkWWVhciA+MTk5NF0gPC0gVFJVRQpwcmVzdXNhbHQkaXMuZXVbcHJlc3VzYWx0JENvdW50cnk9PSAiU1dFIiAmIHByZXN1c2FsdCRZZWFyID4xOTk0XSA8LSBUUlVFCgojZmlmdGggd2F2ZQpwcmVzdXNhbHQkaXMuZXVbcHJlc3VzYWx0JENvdW50cnk9PSAiQ1pFIiAmIHByZXN1c2FsdCRZZWFyID4yMDAzXSA8LSBUUlVFCnByZXN1c2FsdCRpcy5ldVtwcmVzdXNhbHQkQ291bnRyeT09ICJIVU4iICYgcHJlc3VzYWx0JFllYXIgPjIwMDNdIDwtIFRSVUUKcHJlc3VzYWx0JGlzLmV1W3ByZXN1c2FsdCRDb3VudHJ5PT0gIlBPTCIgJiBwcmVzdXNhbHQkWWVhciA+MjAwM10gPC0gVFJVRQpwcmVzdXNhbHQkaXMuZXVbcHJlc3VzYWx0JENvdW50cnk9PSAiRVNUIiAmIHByZXN1c2FsdCRZZWFyID4yMDAzXSA8LSBUUlVFCnByZXN1c2FsdCRpcy5ldVtwcmVzdXNhbHQkQ291bnRyeT09ICJMVkEiICYgcHJlc3VzYWx0JFllYXIgPjIwMDNdIDwtIFRSVUUKcHJlc3VzYWx0JGlzLmV1W3ByZXN1c2FsdCRDb3VudHJ5PT0gIkxUVSIgJiBwcmVzdXNhbHQkWWVhciA+MjAwM10gPC0gVFJVRQpwcmVzdXNhbHQkaXMuZXVbcHJlc3VzYWx0JENvdW50cnk9PSAiQ1lQIiAmIHByZXN1c2FsdCRZZWFyID4yMDAzXSA8LSBUUlVFCnByZXN1c2FsdCRpcy5ldVtwcmVzdXNhbHQkQ291bnRyeT09ICJNTFQiICYgcHJlc3VzYWx0JFllYXIgPjIwMDNdIDwtIFRSVUUKcHJlc3VzYWx0JGlzLmV1W3ByZXN1c2FsdCRDb3VudHJ5PT0gIlNWSyIgJiBwcmVzdXNhbHQkWWVhciA+MjAwM10gPC0gVFJVRQpwcmVzdXNhbHQkaXMuZXVbcHJlc3VzYWx0JENvdW50cnk9PSAiU1ZOIiAmIHByZXN1c2FsdCRZZWFyID4yMDAzXSA8LSBUUlVFCgojc2l4dGggd2F2ZQpwcmVzdXNhbHQkaXMuZXVbcHJlc3VzYWx0JENvdW50cnk9PSAiQkdSIiAmIHByZXN1c2FsdCRZZWFyID4yMDA2XSA8LSBUUlVFCnByZXN1c2FsdCRpcy5ldVtwcmVzdXNhbHQkQ291bnRyeT09ICJST1UiICYgcHJlc3VzYWx0JFllYXIgPjIwMDZdIDwtIFRSVUUKCiNzZXZlbnRoIHdhdmUKcHJlc3VzYWx0JGlzLmV1W3ByZXN1c2FsdCRDb3VudHJ5PT0gIkhSViIgJiBwcmVzdXNhbHQkWWVhciA+MjAxMl0gPC0gVFJVRQpgYGAKCgpgYGB7cn0KcHJlc3J1cyA8LSBwcmVzcnVzICU+JSBtdXRhdGUoaXMuZXUgPSBDb3VudHJ5ICVpbiUgRVUpCgojZmlyc3Qgd2F2ZQpwcmVzcnVzJGlzLmV1W3ByZXNydXMkQ291bnRyeT09ICJETksiICYgcHJlc3J1cyRZZWFyID4xOTcyXSA8LSBUUlVFCnByZXNydXMkaXMuZXVbcHJlc3J1cyRDb3VudHJ5PT0gIklSTCIgJiBwcmVzcnVzJFllYXIgPjE5NzJdIDwtIFRSVUUKcHJlc3J1cyRpcy5ldVtwcmVzcnVzJENvdW50cnk9PSAiR0JSIiAmIHByZXNydXMkWWVhciA+MTk3Ml0gPC0gVFJVRQoKI3NlY29uZCB3YXZlCnByZXNydXMkaXMuZXVbcHJlc3J1cyRDb3VudHJ5PT0gIkdSQyIgJiBwcmVzcnVzJFllYXIgPjE5ODBdIDwtIFRSVUUKCiN0aGlyZCB3YXZlCnByZXNydXMkaXMuZXVbcHJlc3J1cyRDb3VudHJ5PT0gIkVTUCIgJiBwcmVzcnVzJFllYXIgPjE5ODVdIDwtIFRSVUUKcHJlc3J1cyRpcy5ldVtwcmVzcnVzJENvdW50cnk9PSAiUFJUIiAmIHByZXNydXMkWWVhciA+MTk4NV0gPC0gVFJVRQoKI2ZvdXJ0aCB3YXZlCnByZXNydXMkaXMuZXVbcHJlc3J1cyRDb3VudHJ5PT0gIkFVVCIgJiBwcmVzcnVzJFllYXIgPjE5OTRdIDwtIFRSVUUKcHJlc3J1cyRpcy5ldVtwcmVzcnVzJENvdW50cnk9PSAiRklOIiAmIHByZXNydXMkWWVhciA+MTk5NF0gPC0gVFJVRQpwcmVzcnVzJGlzLmV1W3ByZXNydXMkQ291bnRyeT09ICJTV0UiICYgcHJlc3J1cyRZZWFyID4xOTk0XSA8LSBUUlVFCgojZmlmdGggd2F2ZQpwcmVzcnVzJGlzLmV1W3ByZXNydXMkQ291bnRyeT09ICJDWkUiICYgcHJlc3J1cyRZZWFyID4yMDAzXSA8LSBUUlVFCnByZXNydXMkaXMuZXVbcHJlc3J1cyRDb3VudHJ5PT0gIkhVTiIgJiBwcmVzcnVzJFllYXIgPjIwMDNdIDwtIFRSVUUKcHJlc3J1cyRpcy5ldVtwcmVzcnVzJENvdW50cnk9PSAiUE9MIiAmIHByZXNydXMkWWVhciA+MjAwM10gPC0gVFJVRQpwcmVzcnVzJGlzLmV1W3ByZXNydXMkQ291bnRyeT09ICJFU1QiICYgcHJlc3J1cyRZZWFyID4yMDAzXSA8LSBUUlVFCnByZXNydXMkaXMuZXVbcHJlc3J1cyRDb3VudHJ5PT0gIkxWQSIgJiBwcmVzcnVzJFllYXIgPjIwMDNdIDwtIFRSVUUKcHJlc3J1cyRpcy5ldVtwcmVzcnVzJENvdW50cnk9PSAiTFRVIiAmIHByZXNydXMkWWVhciA+MjAwM10gPC0gVFJVRQpwcmVzcnVzJGlzLmV1W3ByZXNydXMkQ291bnRyeT09ICJDWVAiICYgcHJlc3J1cyRZZWFyID4yMDAzXSA8LSBUUlVFCnByZXNydXMkaXMuZXVbcHJlc3J1cyRDb3VudHJ5PT0gIk1MVCIgJiBwcmVzcnVzJFllYXIgPjIwMDNdIDwtIFRSVUUKcHJlc3J1cyRpcy5ldVtwcmVzcnVzJENvdW50cnk9PSAiU1ZLIiAmIHByZXNydXMkWWVhciA+MjAwM10gPC0gVFJVRQpwcmVzcnVzJGlzLmV1W3ByZXNydXMkQ291bnRyeT09ICJTVk4iICYgcHJlc3J1cyRZZWFyID4yMDAzXSA8LSBUUlVFCgojc2l4dGggd2F2ZQpwcmVzcnVzJGlzLmV1W3ByZXNydXMkQ291bnRyeT09ICJCR1IiICYgcHJlc3J1cyRZZWFyID4yMDA2XSA8LSBUUlVFCnByZXNydXMkaXMuZXVbcHJlc3J1cyRDb3VudHJ5PT0gIlJPVSIgJiBwcmVzcnVzJFllYXIgPjIwMDZdIDwtIFRSVUUKCiNzZXZlbnRoIHdhdmUKcHJlc3J1cyRpcy5ldVtwcmVzcnVzJENvdW50cnk9PSAiSFJWIiAmIHByZXNydXMkWWVhciA+MjAxMl0gPC0gVFJVRQpgYGAKCgpgYGB7cn0KcHJlc3J1c2FsdCA8LSBwcmVzcnVzYWx0ICU+JSBtdXRhdGUoaXMuZXUgPSBDb3VudHJ5ICVpbiUgRVUpCgojZmlyc3Qgd2F2ZQpwcmVzcnVzYWx0JGlzLmV1W3ByZXNydXNhbHQkQ291bnRyeT09ICJETksiICYgcHJlc3J1c2FsdCRZZWFyID4xOTcyXSA8LSBUUlVFCnByZXNydXNhbHQkaXMuZXVbcHJlc3J1c2FsdCRDb3VudHJ5PT0gIklSTCIgJiBwcmVzcnVzYWx0JFllYXIgPjE5NzJdIDwtIFRSVUUKcHJlc3J1c2FsdCRpcy5ldVtwcmVzcnVzYWx0JENvdW50cnk9PSAiR0JSIiAmIHByZXNydXNhbHQkWWVhciA+MTk3Ml0gPC0gVFJVRQoKI3NlY29uZCB3YXZlCnByZXNydXNhbHQkaXMuZXVbcHJlc3J1c2FsdCRDb3VudHJ5PT0gIkdSQyIgJiBwcmVzcnVzYWx0JFllYXIgPjE5ODBdIDwtIFRSVUUKCiN0aGlyZCB3YXZlCnByZXNydXNhbHQkaXMuZXVbcHJlc3J1c2FsdCRDb3VudHJ5PT0gIkVTUCIgJiBwcmVzcnVzYWx0JFllYXIgPjE5ODVdIDwtIFRSVUUKcHJlc3J1c2FsdCRpcy5ldVtwcmVzcnVzYWx0JENvdW50cnk9PSAiUFJUIiAmIHByZXNydXNhbHQkWWVhciA+MTk4NV0gPC0gVFJVRQoKI2ZvdXJ0aCB3YXZlCnByZXNydXNhbHQkaXMuZXVbcHJlc3J1c2FsdCRDb3VudHJ5PT0gIkFVVCIgJiBwcmVzcnVzYWx0JFllYXIgPjE5OTRdIDwtIFRSVUUKcHJlc3J1c2FsdCRpcy5ldVtwcmVzcnVzYWx0JENvdW50cnk9PSAiRklOIiAmIHByZXNydXNhbHQkWWVhciA+MTk5NF0gPC0gVFJVRQpwcmVzcnVzYWx0JGlzLmV1W3ByZXNydXNhbHQkQ291bnRyeT09ICJTV0UiICYgcHJlc3J1c2FsdCRZZWFyID4xOTk0XSA8LSBUUlVFCgojZmlmdGggd2F2ZQpwcmVzcnVzYWx0JGlzLmV1W3ByZXNydXNhbHQkQ291bnRyeT09ICJDWkUiICYgcHJlc3J1c2FsdCRZZWFyID4yMDAzXSA8LSBUUlVFCnByZXNydXNhbHQkaXMuZXVbcHJlc3J1c2FsdCRDb3VudHJ5PT0gIkhVTiIgJiBwcmVzcnVzYWx0JFllYXIgPjIwMDNdIDwtIFRSVUUKcHJlc3J1c2FsdCRpcy5ldVtwcmVzcnVzYWx0JENvdW50cnk9PSAiUE9MIiAmIHByZXNydXNhbHQkWWVhciA+MjAwM10gPC0gVFJVRQpwcmVzcnVzYWx0JGlzLmV1W3ByZXNydXNhbHQkQ291bnRyeT09ICJFU1QiICYgcHJlc3J1c2FsdCRZZWFyID4yMDAzXSA8LSBUUlVFCnByZXNydXNhbHQkaXMuZXVbcHJlc3J1c2FsdCRDb3VudHJ5PT0gIkxWQSIgJiBwcmVzcnVzYWx0JFllYXIgPjIwMDNdIDwtIFRSVUUKcHJlc3J1c2FsdCRpcy5ldVtwcmVzcnVzYWx0JENvdW50cnk9PSAiTFRVIiAmIHByZXNydXNhbHQkWWVhciA+MjAwM10gPC0gVFJVRQpwcmVzcnVzYWx0JGlzLmV1W3ByZXNydXNhbHQkQ291bnRyeT09ICJDWVAiICYgcHJlc3J1c2FsdCRZZWFyID4yMDAzXSA8LSBUUlVFCnByZXNydXNhbHQkaXMuZXVbcHJlc3J1c2FsdCRDb3VudHJ5PT0gIk1MVCIgJiBwcmVzcnVzYWx0JFllYXIgPjIwMDNdIDwtIFRSVUUKcHJlc3J1c2FsdCRpcy5ldVtwcmVzcnVzYWx0JENvdW50cnk9PSAiU1ZLIiAmIHByZXNydXNhbHQkWWVhciA+MjAwM10gPC0gVFJVRQpwcmVzcnVzYWx0JGlzLmV1W3ByZXNydXNhbHQkQ291bnRyeT09ICJTVk4iICYgcHJlc3J1c2FsdCRZZWFyID4yMDAzXSA8LSBUUlVFCgojc2l4dGggd2F2ZQpwcmVzcnVzYWx0JGlzLmV1W3ByZXNydXNhbHQkQ291bnRyeT09ICJCR1IiICYgcHJlc3J1c2FsdCRZZWFyID4yMDA2XSA8LSBUUlVFCnByZXNydXNhbHQkaXMuZXVbcHJlc3J1c2FsdCRDb3VudHJ5PT0gIlJPVSIgJiBwcmVzcnVzYWx0JFllYXIgPjIwMDZdIDwtIFRSVUUKCiNzZXZlbnRoIHdhdmUKcHJlc3J1c2FsdCRpcy5ldVtwcmVzcnVzYWx0JENvdW50cnk9PSAiSFJWIiAmIHByZXNydXNhbHQkWWVhciA+MjAxMl0gPC0gVFJVRQpgYGAKCgoKQ2FsY3VsYXRpbmcgYXZlcmFnZSBzY29yZXMgYW5kIHN0YW5kYXJkIGRldmlhdGlvbnMgZm9yIEVVIG1lbWJlciBzdGF0ZXMuCgpgYGB7cn0KCmV1X3J1c2EgPC0gc3VtbWFyaXNlKGdyb3VwX2J5KGZpbHRlcihydXNhLCBpcy5ldT09VFJVRSksIFllYXIpLCAKICAgICAgICAgICAgICAgICAgICAgIHNjb3JlX3J1c2EgPSBtZWFuKHdzY29yZSksIHNkX3J1c2EgPSBzZCh3c2NvcmUpKQoKCgpldV9jaG51c2EgPC0gc3VtbWFyaXNlKGdyb3VwX2J5KGZpbHRlcihjaG51c2EsIGlzLmV1PT1UUlVFKSwgWWVhciksIAogICAgICAgICAgICAgICAgICAgICAgc2NvcmVfY2huID0gbWVhbih3c2NvcmUpLCBzZF9jaG4gPSBzZCh3c2NvcmUpKQoKCmV1X2RlcnVzIDwtIHN1bW1hcmlzZShncm91cF9ieShmaWx0ZXIoZGVydXMsIGlzLmV1PT1UUlVFKSwgWWVhciksIAogICAgICAgICAgICAgICAgICAgICAgc2NvcmVfZGVydXMgPSBtZWFuKHdzY29yZSksIHNkX2RlcnVzID0gc2Qod3Njb3JlKSkKCgpldV9kZXVzYSA8LSBzdW1tYXJpc2UoZ3JvdXBfYnkoZmlsdGVyKGRldXNhLCBpcy5ldT09VFJVRSksIFllYXIpLCAKICAgICAgICAgICAgICAgICAgICAgIHNjb3JlX2RldXNhID0gbWVhbih3c2NvcmUpLCBzZF9kZXVzYSA9IHNkKHdzY29yZSkpCgoKZXVfbHV4ZXJ1cyA8LSBzdW1tYXJpc2UoZ3JvdXBfYnkoZmlsdGVyKGx1eGVydXMsIGlzLmV1PT1UUlVFKSwgWWVhciksIAogICAgICAgICAgICAgICAgICAgICAgc2NvcmVfbHV4ZXJ1cyA9IG1lYW4od3Njb3JlKSwgc2RfbHV4ZXJ1cyA9IHNkKHdzY29yZSkpCgoKZXVfbHV4dXMgPC0gc3VtbWFyaXNlKGdyb3VwX2J5KGZpbHRlcihsdXh1cywgaXMuZXU9PVRSVUUpLCBZZWFyKSwgCiAgICAgICAgICAgICAgICAgICAgICBzY29yZV9sdXh1cyA9IG1lYW4od3Njb3JlKSwgc2RfbHV4dXMgPSBzZCh3c2NvcmUpKQoKCmV1X3BhbCA8LSBzdW1tYXJpc2UoZ3JvdXBfYnkoZmlsdGVyKHBhbCwgaXMuZXU9PVRSVUUpLCBZZWFyKSwgCiAgICAgICAgICAgICAgICAgICAgICBzY29yZV9wYWwgPSBtZWFuKHdzY29yZSksIHNkX3BhbCA9IHNkKHdzY29yZSkpCgoKZXVfcHJlc3VzIDwtIHN1bW1hcmlzZShncm91cF9ieShmaWx0ZXIocHJlc3VzLCBpcy5ldT09VFJVRSksIFllYXIpLCAKICAgICAgICAgICAgICAgICAgICAgIHNjb3JlX3ByZXN1cyA9IG1lYW4od3Njb3JlKSwgc2RfcHJlc3VzID0gc2Qod3Njb3JlKSkKCmV1X3ByZXN1c2FsdCA8LSBzdW1tYXJpc2UoZ3JvdXBfYnkoZmlsdGVyKHByZXN1c2FsdCwgaXMuZXU9PVRSVUUpLCBZZWFyKSwgCiAgICAgICAgICAgICAgICAgICAgICBzY29yZV9wcmVzdXNhbHQgPSBtZWFuKHdzY29yZSksIHNkX3ByZXN1c2FsdCA9IHNkKHdzY29yZSkpCgoKZXVfcHJlc3J1cyA8LSBzdW1tYXJpc2UoZ3JvdXBfYnkoZmlsdGVyKHByZXNydXMsIGlzLmV1PT1UUlVFKSwgWWVhciksIAogICAgICAgICAgICAgICAgICAgICAgc2NvcmVfcHJlc3J1cyA9IG1lYW4od3Njb3JlKSwgc2RfcHJlc3J1cyA9IHNkKHdzY29yZSkpCgoKCmV1X3ByZXNydXNhbHQgPC0gc3VtbWFyaXNlKGdyb3VwX2J5KGZpbHRlcihwcmVzcnVzYWx0LCBpcy5ldT09VFJVRSksIFllYXIpLCAKICAgICAgICAgICAgICAgICAgICAgIHNjb3JlX3ByZXNydXNhbHQgPSBtZWFuKHdzY29yZSksIHNkX3ByZXNydXNhbHQgPSBzZCh3c2NvcmUpKQoKCgpldV9zY29yZXMgPC0gbGVmdF9qb2luKGV1X3J1c2EsIGV1X2NobnVzYSwgYnk9IlllYXIiICkKCmV1X3Njb3JlcyA8LSBsZWZ0X2pvaW4oZXVfc2NvcmVzLCBldV9kZXJ1cywgYnk9IlllYXIiICkKCmV1X3Njb3JlcyA8LSBsZWZ0X2pvaW4oZXVfc2NvcmVzLCBldV9kZXVzYSwgYnk9IlllYXIiICkKCmV1X3Njb3JlcyA8LSBsZWZ0X2pvaW4oZXVfc2NvcmVzLCBldV9sdXhlcnVzLCBieT0iWWVhciIgKQoKZXVfc2NvcmVzIDwtIGxlZnRfam9pbihldV9zY29yZXMsIGV1X2x1eHVzLCBieT0iWWVhciIgKQoKZXVfc2NvcmVzIDwtIGxlZnRfam9pbihldV9zY29yZXMsIGV1X3BhbCwgYnk9IlllYXIiICkKCmV1X3Njb3JlcyA8LSBsZWZ0X2pvaW4oZXVfc2NvcmVzLCBldV9wcmVzdXMsIGJ5PSJZZWFyIiApCgpldV9zY29yZXMgPC0gbGVmdF9qb2luKGV1X3Njb3JlcywgZXVfcHJlc3VzYWx0LCBieT0iWWVhciIgKQoKZXVfc2NvcmVzIDwtIGxlZnRfam9pbihldV9zY29yZXMsIGV1X3ByZXNydXMsIGJ5PSJZZWFyIiApCgpldV9zY29yZXMgPC0gbGVmdF9qb2luKGV1X3Njb3JlcywgZXVfcHJlc3J1c2FsdCwgYnk9IlllYXIiICkKCgpgYGAKCgoKCgojIyNQbG90cyB3aXRoIHdvcmRzY29yZSByZXN1bHRzCgojIyMjQXZlcmFnZXMKCmBgYHtyfQojUGxvdCBvZiBhdmVyYWdlIHNjb3JlcwpnZ3Bsb3QoZGF0YSA9IGV1X3Njb3JlcykgKwogIGdlb21fcG9pbnQoYWVzKHg9WWVhciwgeT1zY29yZV9ydXNhKSwgbmEucm0gPSBUUlVFLCBjb2xvdXIgPSAiYmx1ZSIpICsgCiAgZ2VvbV9zbW9vdGgoYWVzKHg9WWVhciwgeT1zY29yZV9ydXNhKSwgY29sb3VyID0gImJsdWUiLCBzZSA9IEZBTFNFKSArCiAgeWxhYigiQXZlcmFnZSB3b3Jkc2NvcmUgZm9yIEVVIikgKwogIGdndGl0bGUoIlVTQSAoKzEpIC0gUnVzc2lhICgtMSkgZGltZW5zaW9uIikgKwogIHRoZW1lX2J3KCkKCmdnc2F2ZSgiYXZzY29yZVJVU0EucGRmIikKYGBgCgoKYGBge3J9CiNQbG90IG9mIGF2ZXJhZ2Ugc2NvcmVzCmdncGxvdChkYXRhID0gZXVfc2NvcmVzKSArCiAgZ2VvbV9wb2ludChhZXMoeD1ZZWFyLCB5PXNjb3JlX2NobiksIG5hLnJtID0gVFJVRSwgY29sb3VyID0gImJsdWUiKSArIAogIGdlb21fc21vb3RoKGFlcyh4PVllYXIsIHk9c2NvcmVfY2huKSwgY29sb3VyID0gImJsdWUiLCBzZSA9IEZBTFNFKSArCiAgeWxhYigiQXZlcmFnZSB3b3Jkc2NvcmUgZm9yIEVVIikgKwogIGdndGl0bGUoIlVTQSAoKzEpIC0gQ2hpbmEgKC0xKSBkaW1lbnNpb24iKSArCiAgdGhlbWVfYncoKQoKZ2dzYXZlKCJhdnNjb3JlQ0hOLnBkZiIpCmBgYAoKCgpgYGB7cn0KI1Bsb3Qgb2YgYXZlcmFnZSBzY29yZXMKZ2dwbG90KGRhdGEgPSBldV9zY29yZXMpICsKICBnZW9tX3BvaW50KGFlcyh4PVllYXIsIHk9c2NvcmVfZGVydXMpLCBuYS5ybSA9IFRSVUUsIGNvbG91ciA9ICJibHVlIikgKyAKICBnZW9tX3Ntb290aChhZXMoeD1ZZWFyLCB5PXNjb3JlX2RlcnVzKSwgY29sb3VyID0gImJsdWUiLCBzZSA9IEZBTFNFKSArCiAgeWxhYigiQXZlcmFnZSB3b3Jkc2NvcmUgZm9yIEVVIikgKwogIGdndGl0bGUoIkRFVSAoKzEpIC0gUlVTICgtMSkgZGltZW5zaW9uIikgKwogIHRoZW1lX2J3KCkKCmdnc2F2ZSgiYXZzY29yZURFUlVTLnBkZiIpCmBgYAoKCgoKYGBge3J9CiNQbG90IG9mIGF2ZXJhZ2Ugc2NvcmVzCmdncGxvdChkYXRhID0gZXVfc2NvcmVzKSArCiAgZ2VvbV9wb2ludChhZXMoeD1ZZWFyLCB5PXNjb3JlX2RldXNhKSwgbmEucm0gPSBUUlVFLCBjb2xvdXIgPSAiYmx1ZSIpICsgCiAgZ2VvbV9zbW9vdGgoYWVzKHg9WWVhciwgeT1zY29yZV9kZXVzYSksIGNvbG91ciA9ICJibHVlIiwgc2UgPSBGQUxTRSkgKwogIHlsYWIoIkF2ZXJhZ2Ugd29yZHNjb3JlIGZvciBFVSIpICsKICBnZ3RpdGxlKCJVU0EgKCsxKSAtIERFVSAoLTEpIGRpbWVuc2lvbiIpICsKICB0aGVtZV9idygpCgpnZ3NhdmUoImF2c2NvcmVERVVTQS5wZGYiKQpgYGAKCgpgYGB7cn0KI1Bsb3Qgb2YgYXZlcmFnZSBzY29yZXMKZ2dwbG90KGRhdGEgPSBldV9zY29yZXMpICsKICBnZW9tX3BvaW50KGFlcyh4PVllYXIsIHk9c2NvcmVfbHV4ZXJ1cyksIG5hLnJtID0gVFJVRSwgY29sb3VyID0gImJsdWUiKSArIAogIGdlb21fc21vb3RoKGFlcyh4PVllYXIsIHk9c2NvcmVfbHV4ZXJ1cyksIGNvbG91ciA9ICJibHVlIiwgc2UgPSBGQUxTRSkgKwogIHlsYWIoIkF2ZXJhZ2Ugd29yZHNjb3JlIGZvciBFVSIpICsKICBnZ3RpdGxlKCJMVVggKCsxKSAtIFJVUyAoLTEpIGRpbWVuc2lvbiIpICsKICB0aGVtZV9idygpCgpnZ3NhdmUoImF2c2NvcmVMVVhFUlVTLnBkZiIpCmBgYAoKYGBge3J9CiNQbG90IG9mIGF2ZXJhZ2Ugc2NvcmVzCmdncGxvdChkYXRhID0gZXVfc2NvcmVzKSArCiAgZ2VvbV9wb2ludChhZXMoeD1ZZWFyLCB5PXNjb3JlX2x1eHVzKSwgbmEucm0gPSBUUlVFLCBjb2xvdXIgPSAiYmx1ZSIpICsgCiAgZ2VvbV9zbW9vdGgoYWVzKHg9WWVhciwgeT1zY29yZV9sdXh1cyksIGNvbG91ciA9ICJibHVlIiwgc2UgPSBGQUxTRSkgKwogIHlsYWIoIkF2ZXJhZ2Ugd29yZHNjb3JlIGZvciBFVSIpICsKICBnZ3RpdGxlKCJVU0EgKCsxKSAtIExVWCAoLTEpIGRpbWVuc2lvbiIpICsKICB0aGVtZV9idygpCgpnZ3NhdmUoImF2c2NvcmVMVVhVUy5wZGYiKQpgYGAKCgpgYGB7cn0KI1Bsb3Qgb2YgYXZlcmFnZSBzY29yZXMKZ2dwbG90KGRhdGEgPSBzdWJzZXQoZXVfc2NvcmVzLCBZZWFyPjE5OTcpKSArCiAgZ2VvbV9wb2ludChhZXMoeD1ZZWFyLCB5PXNjb3JlX3BhbCksIG5hLnJtID0gVFJVRSwgY29sb3VyID0gImJsdWUiKSArIAogIGdlb21fc21vb3RoKGFlcyh4PVllYXIsIHk9c2NvcmVfcGFsKSwgY29sb3VyID0gImJsdWUiLCBzZSA9IEZBTFNFKSArCiAgeWxhYigiQXZlcmFnZSB3b3Jkc2NvcmUgZm9yIEVVIikgKwogIGdndGl0bGUoIklTUiAoKzEpIC0gUFNFICgtMSkgZGltZW5zaW9uIikgKwogIHRoZW1lX2J3KCkKCmdnc2F2ZSgiYXZzY29yZVBBTC5wZGYiKQpgYGAKCgpgYGB7cn0KI1Bsb3Qgb2YgYXZlcmFnZSBzY29yZXMKZ2dwbG90KGRhdGEgPSBldV9zY29yZXMpICsKICBnZW9tX3BvaW50KGFlcyh4PVllYXIsIHk9c2NvcmVfcHJlc3VzKSwgbmEucm0gPSBUUlVFLCBjb2xvdXIgPSAiYmx1ZSIpICsgCiAgZ2VvbV9zbW9vdGgoYWVzKHg9WWVhciwgeT1zY29yZV9wcmVzdXMpLCBjb2xvdXIgPSAiYmx1ZSIsIHNlID0gRkFMU0UpICsKICB5bGFiKCJBdmVyYWdlIHdvcmRzY29yZSBmb3IgRVUiKSArCiAgZ2d0aXRsZSgiVVNBICgrMSkgLSBQcmVzaWRlbmN5ICgtMSkgZGltZW5zaW9uIikgKwogIHRoZW1lX2J3KCkKCmdnc2F2ZSgiYXZzY29yZVBSRVNVUy5wZGYiKQpgYGAKCgpgYGB7cn0KI1Bsb3Qgb2YgYXZlcmFnZSBzY29yZXMKZ2dwbG90KGRhdGEgPSBldV9zY29yZXMpICsKICBnZW9tX3BvaW50KGFlcyh4PVllYXIsIHk9c2NvcmVfcHJlc3VzYWx0KSwgbmEucm0gPSBUUlVFLCBjb2xvdXIgPSAiYmx1ZSIpICsgCiAgZ2VvbV9zbW9vdGgoYWVzKHg9WWVhciwgeT1zY29yZV9wcmVzdXNhbHQpLCBjb2xvdXIgPSAiYmx1ZSIsIHNlID0gRkFMU0UpICsKICB5bGFiKCJBdmVyYWdlIHdvcmRzY29yZSBmb3IgRVUiKSArCiAgZ2d0aXRsZSgiVVNBICgrMSkgLSBQcmVzaWRlbmN5QUxUICgtMSkgZGltZW5zaW9uIikgKwogIHRoZW1lX2J3KCkKCmdnc2F2ZSgiYXZzY29yZVBSRVNVU2FsdC5wZGYiKQpgYGAKCgoKYGBge3J9CiNQbG90IG9mIGF2ZXJhZ2Ugc2NvcmVzCmdncGxvdChkYXRhID0gZXVfc2NvcmVzKSArCiAgZ2VvbV9wb2ludChhZXMoeD1ZZWFyLCB5PXNjb3JlX3ByZXNydXMpLCBuYS5ybSA9IFRSVUUsIGNvbG91ciA9ICJibHVlIikgKyAKICBnZW9tX3Ntb290aChhZXMoeD1ZZWFyLCB5PXNjb3JlX3ByZXNydXMpLCBjb2xvdXIgPSAiYmx1ZSIsIHNlID0gRkFMU0UpICsKICB5bGFiKCJBdmVyYWdlIHdvcmRzY29yZSBmb3IgRVUiKSArCiAgZ2d0aXRsZSgiUHJlc2lkZW5jeSAoKzEpIC0gUlVTICgtMSkgZGltZW5zaW9uIikgKwogIHRoZW1lX2J3KCkKCmdnc2F2ZSgiYXZzY29yZVBSRVNSVVMucGRmIikKYGBgCgoKCmBgYHtyfQojUGxvdCBvZiBhdmVyYWdlIHNjb3JlcwpnZ3Bsb3QoZGF0YSA9IGV1X3Njb3JlcykgKwogIGdlb21fcG9pbnQoYWVzKHg9WWVhciwgeT1zY29yZV9wcmVzcnVzYWx0KSwgbmEucm0gPSBUUlVFLCBjb2xvdXIgPSAiYmx1ZSIpICsgCiAgZ2VvbV9zbW9vdGgoYWVzKHg9WWVhciwgeT1zY29yZV9wcmVzcnVzYWx0KSwgY29sb3VyID0gImJsdWUiLCBzZSA9IEZBTFNFKSArCiAgeWxhYigiQXZlcmFnZSB3b3Jkc2NvcmUgZm9yIEVVIikgKwogIGdndGl0bGUoIlByZXNpZGVuY3lBTFQgKCsxKSAtIFJVUyAoLTEpIGRpbWVuc2lvbiIpICsKICB0aGVtZV9idygpCgpnZ3NhdmUoImF2c2NvcmVQUkVTUlVTYWx0LnBkZiIpCmBgYAoKCgojIyMjU3RhbmRhcmQgZGV2aWF0aW9ucwoKCmBgYHtyfQojUGxvdCBvZiBzZCBzY29yZXMKZ2dwbG90KGRhdGEgPSBldV9zY29yZXMpICsKICBnZW9tX3BvaW50KGFlcyh4PVllYXIsIHk9c2RfcnVzYSksIG5hLnJtID0gVFJVRSwgY29sb3VyID0gImJsdWUiKSArIAogIGdlb21fc21vb3RoKGFlcyh4PVllYXIsIHk9c2RfcnVzYSksIGNvbG91ciA9ICJibHVlIiwgc2UgPSBGQUxTRSkgKwogIHlsYWIoIlN0YW5kYXJkIGRldmlhdGlvbiBvZiB3b3Jkc2NvcmVzIGZvciBFVSIpICsKICBnZ3RpdGxlKCJVU0EgKCsxKSAtIFJ1c3NpYSAoLTEpIGRpbWVuc2lvbiIpICsKICB0aGVtZV9idygpCgpnZ3NhdmUoInNkc2NvcmVSVVNBLnBkZiIpCmBgYAoKCmBgYHtyfQojUGxvdCBvZiBzZCBzY29yZXMKZ2dwbG90KGRhdGEgPSBldV9zY29yZXMpICsKICBnZW9tX3BvaW50KGFlcyh4PVllYXIsIHk9c2RfY2huKSwgbmEucm0gPSBUUlVFLCBjb2xvdXIgPSAiYmx1ZSIpICsgCiAgZ2VvbV9zbW9vdGgoYWVzKHg9WWVhciwgeT1zZF9jaG4pLCBjb2xvdXIgPSAiYmx1ZSIsIHNlID0gRkFMU0UpICsKICB5bGFiKCJTdGFuZGFyZCBkZXZpYXRpb24gb2Ygd29yZHNjb3JlcyBmb3IgRVUiKSArCiAgZ2d0aXRsZSgiVVNBICgrMSkgLSBDaGluYSAoLTEpIGRpbWVuc2lvbiIpICsKICB0aGVtZV9idygpCgpnZ3NhdmUoInNkc2NvcmVDSE4ucGRmIikKYGBgCgoKCmBgYHtyfQojUGxvdCBvZiBzZCBzY29yZXMKZ2dwbG90KGRhdGEgPSBldV9zY29yZXMpICsKICBnZW9tX3BvaW50KGFlcyh4PVllYXIsIHk9c2RfZGVydXMpLCBuYS5ybSA9IFRSVUUsIGNvbG91ciA9ICJibHVlIikgKyAKICBnZW9tX3Ntb290aChhZXMoeD1ZZWFyLCB5PXNkX2RlcnVzKSwgY29sb3VyID0gImJsdWUiLCBzZSA9IEZBTFNFKSArCiAgeWxhYigiU3RhbmRhcmQgZGV2aWF0aW9uIG9mIHdvcmRzY29yZXMgZm9yIEVVIikgKwogIGdndGl0bGUoIkRFVSAoKzEpIC0gUlVTICgtMSkgZGltZW5zaW9uIikgKwogIHRoZW1lX2J3KCkKCmdnc2F2ZSgic2RzY29yZURFUlVTLnBkZiIpCmBgYAoKCgpgYGB7cn0KI1Bsb3Qgb2Ygc2Qgc2NvcmVzCmdncGxvdChkYXRhID0gZXVfc2NvcmVzKSArCiAgZ2VvbV9wb2ludChhZXMoeD1ZZWFyLCB5PXNkX2RldXNhKSwgbmEucm0gPSBUUlVFLCBjb2xvdXIgPSAiYmx1ZSIpICsgCiAgZ2VvbV9zbW9vdGgoYWVzKHg9WWVhciwgeT1zZF9kZXVzYSksIGNvbG91ciA9ICJibHVlIiwgc2UgPSBGQUxTRSkgKwogIHlsYWIoIlN0YW5kYXJkIGRldmlhdGlvbiBvZiB3b3Jkc2NvcmVzIGZvciBFVSIpICsKICBnZ3RpdGxlKCJVU0EgKCsxKSAtIERFVSAoLTEpIGRpbWVuc2lvbiIpICsKICB0aGVtZV9idygpCgpnZ3NhdmUoInNkc2NvcmVERVVTQS5wZGYiKQpgYGAKCgoKYGBge3J9CiNQbG90IG9mIHNkIHNjb3JlcwpnZ3Bsb3QoZGF0YSA9IGV1X3Njb3JlcykgKwogIGdlb21fcG9pbnQoYWVzKHg9WWVhciwgeT1zZF9sdXhlcnVzKSwgbmEucm0gPSBUUlVFLCBjb2xvdXIgPSAiYmx1ZSIpICsgCiAgZ2VvbV9zbW9vdGgoYWVzKHg9WWVhciwgeT1zZF9sdXhlcnVzKSwgY29sb3VyID0gImJsdWUiLCBzZSA9IEZBTFNFKSArCiAgeWxhYigiU3RhbmRhcmQgZGV2aWF0aW9uIG9mIHdvcmRzY29yZXMgZm9yIEVVIikgKwogIGdndGl0bGUoIkxVWCAoKzEpIC0gUlVTICgtMSkgZGltZW5zaW9uIikgKwogIHRoZW1lX2J3KCkKCmdnc2F2ZSgic2RzY29yZUxVWEVSVVMucGRmIikKYGBgCgoKCmBgYHtyfQojUGxvdCBvZiBzZCBzY29yZXMKZ2dwbG90KGRhdGEgPSBldV9zY29yZXMpICsKICBnZW9tX3BvaW50KGFlcyh4PVllYXIsIHk9c2RfbHV4dXMpLCBuYS5ybSA9IFRSVUUsIGNvbG91ciA9ICJibHVlIikgKyAKICBnZW9tX3Ntb290aChhZXMoeD1ZZWFyLCB5PXNkX2x1eHVzKSwgY29sb3VyID0gImJsdWUiLCBzZSA9IEZBTFNFKSArCiAgeWxhYigiU3RhbmRhcmQgZGV2aWF0aW9uIG9mIHdvcmRzY29yZXMgZm9yIEVVIikgKwogIGdndGl0bGUoIlVTQSAoKzEpIC0gTFVYICgtMSkgZGltZW5zaW9uIikgKwogIHRoZW1lX2J3KCkKCmdnc2F2ZSgic2RzY29yZUxVWFVTLnBkZiIpCmBgYAoKCgpgYGB7cn0KI1Bsb3Qgb2Ygc2Qgc2NvcmVzCmdncGxvdChkYXRhID0gc3Vic2V0KGV1X3Njb3JlcywgWWVhcj4xOTk3KSkgKwogIGdlb21fcG9pbnQoYWVzKHg9WWVhciwgeT1zZF9wYWwpLCBuYS5ybSA9IFRSVUUsIGNvbG91ciA9ICJibHVlIikgKyAKICBnZW9tX3Ntb290aChhZXMoeD1ZZWFyLCB5PXNkX3BhbCksIGNvbG91ciA9ICJibHVlIiwgc2UgPSBGQUxTRSkgKwogIHlsYWIoIlN0YW5kYXJkIGRldmlhdGlvbiBvZiB3b3Jkc2NvcmVzIGZvciBFVSIpICsKICBnZ3RpdGxlKCJJU1IgKCsxKSAtIFBTRSAoLTEpIGRpbWVuc2lvbiIpICsKICB0aGVtZV9idygpCgpnZ3NhdmUoInNkc2NvcmVQQUwucGRmIikKYGBgCgoKYGBge3J9CiNQbG90IG9mIHNkIHNjb3JlcwpnZ3Bsb3QoZGF0YSA9IGV1X3Njb3JlcykgKwogIGdlb21fcG9pbnQoYWVzKHg9WWVhciwgeT1zZF9wcmVzdXMpLCBuYS5ybSA9IFRSVUUsIGNvbG91ciA9ICJibHVlIikgKyAKICBnZW9tX3Ntb290aChhZXMoeD1ZZWFyLCB5PXNkX3ByZXN1cyksIGNvbG91ciA9ICJibHVlIiwgc2UgPSBGQUxTRSkgKwogIHlsYWIoIlN0YW5kYXJkIGRldmlhdGlvbiBvZiB3b3Jkc2NvcmVzIGZvciBFVSIpICsKICBnZ3RpdGxlKCJVU0EgKCsxKSAtIFByZXNpZGVuY3kgKC0xKSBkaW1lbnNpb24iKSArCiAgdGhlbWVfYncoKQoKZ2dzYXZlKCJzZHNjb3JlUFJFU1VTLnBkZiIpCmBgYAoKCmBgYHtyfQojUGxvdCBvZiBzZCBzY29yZXMKZ2dwbG90KGRhdGEgPSBldV9zY29yZXMpICsKICBnZW9tX3BvaW50KGFlcyh4PVllYXIsIHk9c2RfcHJlc3VzYWx0KSwgbmEucm0gPSBUUlVFLCBjb2xvdXIgPSAiYmx1ZSIpICsgCiAgZ2VvbV9zbW9vdGgoYWVzKHg9WWVhciwgeT1zZF9wcmVzdXNhbHQpLCBjb2xvdXIgPSAiYmx1ZSIsIHNlID0gRkFMU0UpICsKICB5bGFiKCJTdGFuZGFyZCBkZXZpYXRpb24gb2Ygd29yZHNjb3JlcyBmb3IgRVUiKSArCiAgZ2d0aXRsZSgiVVNBICgrMSkgLSBQcmVzaWRlbmN5QUxUICgtMSkgZGltZW5zaW9uIikgKwogIHRoZW1lX2J3KCkKCmdnc2F2ZSgic2RzY29yZVBSRVNVU2FsdC5wZGYiKQpgYGAKCmBgYHtyfQojUGxvdCBvZiBzZCBzY29yZXMKZ2dwbG90KGRhdGEgPSBldV9zY29yZXMpICsKICBnZW9tX3BvaW50KGFlcyh4PVllYXIsIHk9c2RfcHJlc3J1cyksIG5hLnJtID0gVFJVRSwgY29sb3VyID0gImJsdWUiKSArIAogIGdlb21fc21vb3RoKGFlcyh4PVllYXIsIHk9c2RfcHJlc3J1cyksIGNvbG91ciA9ICJibHVlIiwgc2UgPSBGQUxTRSkgKwogIHlsYWIoIlN0YW5kYXJkIGRldmlhdGlvbiBvZiB3b3Jkc2NvcmVzIGZvciBFVSIpICsKICBnZ3RpdGxlKCJQcmVzaWRlbmN5ICgrMSkgLSBSVVMgKC0xKSBkaW1lbnNpb24iKSArCiAgdGhlbWVfYncoKQoKZ2dzYXZlKCJzZHNjb3JlUFJFU1JVUy5wZGYiKQpgYGAKCgpgYGB7cn0KI1Bsb3Qgb2Ygc2Qgc2NvcmVzCmdncGxvdChkYXRhID0gZXVfc2NvcmVzKSArCiAgZ2VvbV9wb2ludChhZXMoeD1ZZWFyLCB5PXNkX3ByZXNydXNhbHQpLCBuYS5ybSA9IFRSVUUsIGNvbG91ciA9ICJibHVlIikgKyAKICBnZW9tX3Ntb290aChhZXMoeD1ZZWFyLCB5PXNkX3ByZXNydXNhbHQpLCBjb2xvdXIgPSAiYmx1ZSIsIHNlID0gRkFMU0UpICsKICB5bGFiKCJTdGFuZGFyZCBkZXZpYXRpb24gb2Ygd29yZHNjb3JlcyBmb3IgRVUiKSArCiAgZ2d0aXRsZSgiUHJlc2lkZW5jeUFMVCAoKzEpIC0gUlVTICgtMSkgZGltZW5zaW9uIikgKwogIHRoZW1lX2J3KCkKCmdnc2F2ZSgic2RzY29yZVBSRVNSVVNhbHQucGRmIikKYGBgCgoKCgojIyNTaW1pbGFyaXR5IGJhc2VkIHNvY2lhbGl6YXRpb24KCkFzIGEgZGlyZWN0IG1lYXN1cmUgb2YgY29udmVyZ2VuY2UgaW4gZm9yZWlnbiBwb2xpY3kgcHJlZmVyZW5jZXMgd2UgY2FsY3VsYXRlIHNpbWlsYXJpdHkgYmV0d2VlbiBlYWNoIHNwZWVjaCBhbmQgdGhlIG9mZmljaWFsIEVVIHBvbGljeSBhcyBzdGF0ZWQgaW4gc3BlZWNoZXMgYnkgdGhlIHByZXNpZGluZyBFVSBtZW1iZXIgc3RhdGUsIGFuZCwgYWZ0ZXIgMjAwNywgdGhlIHNwZWVjaCBvZiBFQyBwcmVzaWRlbnQuIEluIGFkZGl0aW9uLCB3ZSBjYWxjdWxhdGUgc2ltaWxhcml0eSB0byB0aGUgc3BlZWNoIGJ5IEx1eGVtYm91cmcgd2hpY2ggaW4gb3VyIGludGVydmlld3MgY2FtZSB0aHJvdWdoIGFzIHRoZSBjb3VudHJ5IG1vc3QgaW4gbGluZSB3aXRoIHRoZSBFVSBsaW5lLiAKCldlIHVzZSBjb3NpbmUgc2ltaWxhcml0eSwgcnVubmluZyBlc3RpbWF0aW9uIGJ5IHllYXI6IGkuZS4gY2FsY3VsYXRlcyBzaW1pbGFyaXR5IGJldHdlZW4gZWFjaCBjb3VudHJ5IGFuZCBFVSBwcmVzaWRlbmN5L0VDL0xVWCBmb3IgZWFjaCBzZXNzaW9uIHNlcGFyYXRlbHkuCgoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CgojRGlzdGFuY2UgZXN0aW1hdGlvbnMgYnkgeWVhcgpzaW1pbGFyaXR5IDwtIGRhdGEuZnJhbWUoKQpmb3IgKGkgaW4gYygxOTcxOjE5NzQsIDE5Nzc6MjAxNikpIHsKI0NyZWF0aW5nIGNvcnB1cyBmb3IgMjAxNAoKdW5nZGMuaSA8LSBjb3JwdXNfc3Vic2V0KHVuZ2RfY29ycHVzLCBZZWFyPT1pKQoKdG9rIDwtIHRva2Vucyh1bmdkYy5pLCB3aGF0ID0gIndvcmQiLAogICAgICAgICAgICAgIHJlbW92ZVB1bmN0ID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVTeW1ib2xzID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVOdW1iZXJzID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVUd2l0dGVyID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVVUkwgPSBUUlVFLAogICAgICAgICAgICAgIHJlbW92ZUh5cGhlbnMgPSBUUlVFLAogICAgICAgICAgICAgIHZlcmJvc2UgPSBUUlVFKQoKCmRmbSA8LSBkZm0odG9rLCAKICAgICAgICAgICB0b2xvd2VyID0gVFJVRSwKICAgICAgICAgICByZW1vdmU9c3RvcHdvcmRzKCJTTUFSVCIpLAogICAgICAgICAgIHN0ZW09VFJVRSwgCiAgICAgICAgICAgdmVyYm9zZSA9IFRSVUUpCgojUmVtb3ZpbmcgYW55IGRpZ2l0cy4gYGRmbWAgcGlja3MgdXAgYW55IHNlcGFyYXRlZCBkaWdpdHMsIG5vdCBkaWdpdHMgdGhhdCBhcmUgcGFydCBvZiB0b2tlbnMuCiNSZW1vdmluZyBhbnkgcHVuY3R1YXRpb24uIGBkZm1gIHBpY2tzIHVwIGFueSBwdW5jdHVhdGlvbiB1bmxlc3MgaXQncyBwYXJ0IG9mIGEgdG9rZW4uCiNSZW1vdmluZyBhbnkgdG9rZW5zIGxlc3MgdGhhbiBmb3VyIGNoYXJhY3RlcnMuCmRmbS5tIDwtIGRmbV9zZWxlY3QoZGZtLCBjKCJbXFxkLV0iLCAiW1s6cHVuY3Q6XV0iLCAiXi57MSwzfSQiKSwgc2VsZWN0aW9uID0gInJlbW92ZSIsIAogICAgICAgICAgICAgICAgICAgIHZhbHVldHlwZT0icmVnZXgiLCB2ZXJib3NlID0gVFJVRSkKCgojRHJvcHBpbmcgd29yZHMgdGhhdCBhcHBlYXIgbGVzcyB0aGFuIDUgdGltZXMgYW5kIGluIGxlc3MgdGhhbiAzIGRvY3VtZW50cy4KZGZtLnRyaW0gPC0gZGZtX3RyaW0oZGZtLm0sIG1pbl9jb3VudCA9IDUsIG1pbl9kb2NmcmVxID0gMykKCiN0ZmlkZiB3ZWlnaHRpbmcKZGZtLncgPC0gZGZtX3dlaWdodChkZm0udHJpbSwgdHlwZSA9ICJ0ZmlkZiIpCgojaG9sZGVycyBmb3IgY291bnRyeSBuYW1lcyBpbiBkaXN0YW5jZSBtZWFzdXJlcyBiZWxvdwpsdXggPC0gcGFzdGUwKCJMVVhfIiwgaSwgc2VwPSIiKQoKI0Nvc2luZSBzaW1pbGFyaXR5IGNhbGN1bGF0aW9ucwpzaW1pbGFyaXRpZXMuaSA8LSBhcy5kYXRhLmZyYW1lKGFzLmxpc3QodGV4dHN0YXRfc2ltaWwoZGZtLncsIGx1eCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9ICJkb2N1bWVudHMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gImNvc2luZSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZCA9IEZBTFNFKVsxXSkKCm5hbWVzKHNpbWlsYXJpdGllcy5pKVsxXSA8LSAiTFVYIgoKc2ltaWxhcml0eSA8LSByYmluZChzaW1pbGFyaXR5LHNpbWlsYXJpdGllcy5pKQoKfQoKTFVYX3NpbWlsYXJpdHkgPC0gY2JpbmQoc3RyX3NwbGl0KHJvdy5uYW1lcyhzaW1pbGFyaXR5KSwgIl8iLCBzaW1wbGlmeSA9IFRSVUUpLCBzaW1pbGFyaXR5KQoKbmFtZXMoTFVYX3NpbWlsYXJpdHkpWzFdIDwtICJDb3VudHJ5IgpuYW1lcyhMVVhfc2ltaWxhcml0eSlbMl0gPC0gIlllYXIiCgpMVVhfc2ltaWxhcml0eSRZZWFyIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKExVWF9zaW1pbGFyaXR5JFllYXIpKQpMVVhfc2ltaWxhcml0eSRDb3VudHJ5IDwtIGFzLmNoYXJhY3RlcihMVVhfc2ltaWxhcml0eSRDb3VudHJ5KQoKYGBgCgoKU2ltaWxhcml0eSB3aXRoIEVVIHByZXNpZGVuY3kKCgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0KI0VVIHByZXNpZGVudAoKCnByZXNfc2ltaWxhcml0eSA8LSBkYXRhLmZyYW1lKCkKCmZvciAoaSBpbiBjKDE5NzA6MjAxNikpIHsKICAKI0NyZWF0aW5nIGNvcnB1cyBmb3IgZWFjaCB5ZWFyCnVuZ2RjLmkgPC0gY29ycHVzX3N1YnNldCh1bmdkX2NvcnB1cywgWWVhcj09aSkKCnRvayA8LSB0b2tlbnModW5nZGMuaSwgd2hhdCA9ICJ3b3JkIiwKICAgICAgICAgICAgICByZW1vdmVQdW5jdCA9IFRSVUUsCiAgICAgICAgICAgICAgcmVtb3ZlU3ltYm9scyA9IFRSVUUsCiAgICAgICAgICAgICAgcmVtb3ZlTnVtYmVycyA9IFRSVUUsCiAgICAgICAgICAgICAgcmVtb3ZlVHdpdHRlciA9IFRSVUUsCiAgICAgICAgICAgICAgcmVtb3ZlVVJMID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVIeXBoZW5zID0gVFJVRSwKICAgICAgICAgICAgICB2ZXJib3NlID0gVFJVRSkKCgpkZm0gPC0gZGZtKHRvaywgCiAgICAgICAgICAgdG9sb3dlciA9IFRSVUUsCiAgICAgICAgICAgcmVtb3ZlPXN0b3B3b3JkcygiU01BUlQiKSwKICAgICAgICAgICBzdGVtPVRSVUUsIAogICAgICAgICAgIHZlcmJvc2UgPSBUUlVFKQoKI1JlbW92aW5nIGFueSBkaWdpdHMuIGBkZm1gIHBpY2tzIHVwIGFueSBzZXBhcmF0ZWQgZGlnaXRzLCBub3QgZGlnaXRzIHRoYXQgYXJlIHBhcnQgb2YgdG9rZW5zLgojUmVtb3ZpbmcgYW55IHB1bmN0dWF0aW9uLiBgZGZtYCBwaWNrcyB1cCBhbnkgcHVuY3R1YXRpb24gdW5sZXNzIGl0J3MgcGFydCBvZiBhIHRva2VuLgojUmVtb3ZpbmcgYW55IHRva2VucyBsZXNzIHRoYW4gZm91ciBjaGFyYWN0ZXJzLgpkZm0ubSA8LSBkZm1fc2VsZWN0KGRmbSwgYygiW1xcZC1dIiwgIltbOnB1bmN0Ol1dIiwgIl4uezEsM30kIiksIHNlbGVjdGlvbiA9ICJyZW1vdmUiLCAKICAgICAgICAgICAgICAgICAgICB2YWx1ZXR5cGU9InJlZ2V4IiwgdmVyYm9zZSA9IFRSVUUpCgoKI0Ryb3BwaW5nIHdvcmRzIHRoYXQgYXBwZWFyIGxlc3MgdGhhbiA1IHRpbWVzIGFuZCBpbiBsZXNzIHRoYW4gMyBkb2N1bWVudHMuCmRmbS50cmltIDwtIGRmbV90cmltKGRmbS5tLCBtaW5fY291bnQgPSA1LCBtaW5fZG9jZnJlcSA9IDMpCgojdGZpZGYgd2VpZ2h0aW5nCmRmbS53IDwtIGRmbV93ZWlnaHQoZGZtLnRyaW0sIHR5cGUgPSAidGZpZGYiKQoKI2hvbGRlcnMgZm9yIGNvdW50cnkgbmFtZXMgaW4gZGlzdGFuY2UgbWVhc3VyZXMgYmVsb3cKcHJlcyA8LSBwYXN0ZShwcmVzaWRlbmN5JENvdW50cnlbcHJlc2lkZW5jeSRZZWFyPT1pXSwgaSwgc2VwPSJfIikKCiNDb3NpbmUgc2ltaWxhcml0eSBjYWxjdWxhdGlvbnMKc2ltaWxhcml0aWVzLmkgPC0gYXMuZGF0YS5mcmFtZShhcy5saXN0KHRleHRzdGF0X3NpbWlsKGRmbS53LCBwcmVzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gImRvY3VtZW50cyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAiY29zaW5lIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydGVkID0gRkFMU0UpWzFdKQoKbmFtZXMoc2ltaWxhcml0aWVzLmkpWzFdIDwtICJQUkVTIgoKcHJlc19zaW1pbGFyaXR5IDwtIHJiaW5kKHByZXNfc2ltaWxhcml0eSxzaW1pbGFyaXRpZXMuaSkKCn0KCnByZXNfc2ltaWxhcml0eSA8LSBjYmluZChzdHJfc3BsaXQocm93Lm5hbWVzKHByZXNfc2ltaWxhcml0eSksICJfIiwgc2ltcGxpZnkgPSBUUlVFKSwgcHJlc19zaW1pbGFyaXR5KQoKbmFtZXMocHJlc19zaW1pbGFyaXR5KVsxXSA8LSAiQ291bnRyeSIKbmFtZXMocHJlc19zaW1pbGFyaXR5KVsyXSA8LSAiWWVhciIKCnByZXNfc2ltaWxhcml0eSRZZWFyIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHByZXNfc2ltaWxhcml0eSRZZWFyKSkKcHJlc19zaW1pbGFyaXR5JENvdW50cnkgPC0gYXMuY2hhcmFjdGVyKHByZXNfc2ltaWxhcml0eSRDb3VudHJ5KQoKYGBgCgoKU2ltaWxhcml0eSB3aXRoIEVVIHByZXNpZGVuY3ksIGJ1dCBmcm9tIDIwMTEgc2ltaWxhcml0eSBpcyBjYWxjdWxhdGVkIHdpdGggRUMKCgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0KI0VVIHByZXNpZGVudApwcmVzX3NpbWlsYXJpdHlfZWMgPC0gZGF0YS5mcmFtZSgpCgpmb3IgKGkgaW4gYygxOTcwOjIwMTYpKSB7CiAgCiNDcmVhdGluZyBjb3JwdXMgZm9yIGVhY2ggeWVhcgp1bmdkYy5pIDwtIGNvcnB1c19zdWJzZXQodW5nZF9jb3JwdXMsIFllYXI9PWkpCgp0b2sgPC0gdG9rZW5zKHVuZ2RjLmksIHdoYXQgPSAid29yZCIsCiAgICAgICAgICAgICAgcmVtb3ZlUHVuY3QgPSBUUlVFLAogICAgICAgICAgICAgIHJlbW92ZVN5bWJvbHMgPSBUUlVFLAogICAgICAgICAgICAgIHJlbW92ZU51bWJlcnMgPSBUUlVFLAogICAgICAgICAgICAgIHJlbW92ZVR3aXR0ZXIgPSBUUlVFLAogICAgICAgICAgICAgIHJlbW92ZVVSTCA9IFRSVUUsCiAgICAgICAgICAgICAgcmVtb3ZlSHlwaGVucyA9IFRSVUUsCiAgICAgICAgICAgICAgdmVyYm9zZSA9IFRSVUUpCgoKZGZtIDwtIGRmbSh0b2ssIAogICAgICAgICAgIHRvbG93ZXIgPSBUUlVFLAogICAgICAgICAgIHJlbW92ZT1zdG9wd29yZHMoIlNNQVJUIiksCiAgICAgICAgICAgc3RlbT1UUlVFLCAKICAgICAgICAgICB2ZXJib3NlID0gVFJVRSkKCiNSZW1vdmluZyBhbnkgZGlnaXRzLiBgZGZtYCBwaWNrcyB1cCBhbnkgc2VwYXJhdGVkIGRpZ2l0cywgbm90IGRpZ2l0cyB0aGF0IGFyZSBwYXJ0IG9mIHRva2Vucy4KI1JlbW92aW5nIGFueSBwdW5jdHVhdGlvbi4gYGRmbWAgcGlja3MgdXAgYW55IHB1bmN0dWF0aW9uIHVubGVzcyBpdCdzIHBhcnQgb2YgYSB0b2tlbi4KI1JlbW92aW5nIGFueSB0b2tlbnMgbGVzcyB0aGFuIGZvdXIgY2hhcmFjdGVycy4KZGZtLm0gPC0gZGZtX3NlbGVjdChkZm0sIGMoIltcXGQtXSIsICJbWzpwdW5jdDpdXSIsICJeLnsxLDN9JCIpLCBzZWxlY3Rpb24gPSAicmVtb3ZlIiwgCiAgICAgICAgICAgICAgICAgICAgdmFsdWV0eXBlPSJyZWdleCIsIHZlcmJvc2UgPSBUUlVFKQoKCiNEcm9wcGluZyB3b3JkcyB0aGF0IGFwcGVhciBsZXNzIHRoYW4gNSB0aW1lcyBhbmQgaW4gbGVzcyB0aGFuIDMgZG9jdW1lbnRzLgpkZm0udHJpbSA8LSBkZm1fdHJpbShkZm0ubSwgbWluX2NvdW50ID0gNSwgbWluX2RvY2ZyZXEgPSAzKQoKI3RmaWRmIHdlaWdodGluZwpkZm0udyA8LSBkZm1fd2VpZ2h0KGRmbS50cmltLCB0eXBlID0gInRmaWRmIikKCiNob2xkZXJzIGZvciBjb3VudHJ5IG5hbWVzIGluIGRpc3RhbmNlIG1lYXN1cmVzIGJlbG93CnByZXMgPC0gcGFzdGUocHJlc2lkZW5jeSRDb3VudHJ5X2FsdFtwcmVzaWRlbmN5JFllYXI9PWldLCBpLCBzZXA9Il8iKQoKI0Nvc2luZSBzaW1pbGFyaXR5IGNhbGN1bGF0aW9ucwpzaW1pbGFyaXRpZXMuaSA8LSBhcy5kYXRhLmZyYW1lKGFzLmxpc3QodGV4dHN0YXRfc2ltaWwoZGZtLncsIHByZXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSAiZG9jdW1lbnRzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJjb3NpbmUiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0ZWQgPSBGQUxTRSlbMV0pCgpuYW1lcyhzaW1pbGFyaXRpZXMuaSlbMV0gPC0gIlBSRVNfZWMiCgpwcmVzX3NpbWlsYXJpdHlfZWMgPC0gcmJpbmQocHJlc19zaW1pbGFyaXR5X2VjLHNpbWlsYXJpdGllcy5pKQoKfQoKCnByZXNfc2ltaWxhcml0eV9lYyA8LSBjYmluZChzdHJfc3BsaXQocm93Lm5hbWVzKHByZXNfc2ltaWxhcml0eV9lYyksICJfIiwgc2ltcGxpZnkgPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNfc2ltaWxhcml0eV9lYykKCm5hbWVzKHByZXNfc2ltaWxhcml0eV9lYylbMV0gPC0gIkNvdW50cnkiCm5hbWVzKHByZXNfc2ltaWxhcml0eV9lYylbMl0gPC0gIlllYXIiCgpwcmVzX3NpbWlsYXJpdHlfZWMkWWVhciA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihwcmVzX3NpbWlsYXJpdHlfZWMkWWVhcikpCnByZXNfc2ltaWxhcml0eV9lYyRDb3VudHJ5IDwtIGFzLmNoYXJhY3RlcihwcmVzX3NpbWlsYXJpdHlfZWMkQ291bnRyeSkKCmBgYAoKCkNvbWJpbmluZyBhbGwgc2ltaWxhcml0eSBlc3RpbWF0ZXMgaW50byBvbmUgZmlsZQoKCmBgYHtyfQpzaW1pbF9lc3RpbWF0ZXMgPC0gbGVmdF9qb2luKHByZXNfc2ltaWxhcml0eSwgcHJlc19zaW1pbGFyaXR5X2VjLCBieSA9IGMoIkNvdW50cnkiLCAiWWVhciIpKQpzaW1pbF9lc3RpbWF0ZXMgPC0gbGVmdF9qb2luKHNpbWlsX2VzdGltYXRlcywgTFVYX3NpbWlsYXJpdHksIGJ5ID0gYygiQ291bnRyeSIsICJZZWFyIikpCmBgYAoKClBsb3Qgb2Ygc2ltaWxhcml0aWVzIGZvciBFVSBtZW1iZXIgc3RhdGVzOgoKCmBgYHtyfQojTG9naWNhbHMgZm9yIEVVIG1lbWJlciBzdGF0ZXMKCnNpbWlsX2VzdGltYXRlcyA8LSBzaW1pbF9lc3RpbWF0ZXMgJT4lIG11dGF0ZShpcy5ldSA9IENvdW50cnkgJWluJSBFVSkKCiNmaXJzdCB3YXZlCnNpbWlsX2VzdGltYXRlcyRpcy5ldVtzaW1pbF9lc3RpbWF0ZXMkQ291bnRyeT09ICJETksiICYgc2ltaWxfZXN0aW1hdGVzJFllYXIgPjE5NzJdIDwtIFRSVUUKc2ltaWxfZXN0aW1hdGVzJGlzLmV1W3NpbWlsX2VzdGltYXRlcyRDb3VudHJ5PT0gIklSTCIgJiBzaW1pbF9lc3RpbWF0ZXMkWWVhciA+MTk3Ml0gPC0gVFJVRQpzaW1pbF9lc3RpbWF0ZXMkaXMuZXVbc2ltaWxfZXN0aW1hdGVzJENvdW50cnk9PSAiR0JSIiAmIHNpbWlsX2VzdGltYXRlcyRZZWFyID4xOTcyXSA8LSBUUlVFCgojc2Vjb25kIHdhdmUKc2ltaWxfZXN0aW1hdGVzJGlzLmV1W3NpbWlsX2VzdGltYXRlcyRDb3VudHJ5PT0gIkdSQyIgJiBzaW1pbF9lc3RpbWF0ZXMkWWVhciA+MTk4MF0gPC0gVFJVRQoKI3RoaXJkIHdhdmUKc2ltaWxfZXN0aW1hdGVzJGlzLmV1W3NpbWlsX2VzdGltYXRlcyRDb3VudHJ5PT0gIkVTUCIgJiBzaW1pbF9lc3RpbWF0ZXMkWWVhciA+MTk4NV0gPC0gVFJVRQpzaW1pbF9lc3RpbWF0ZXMkaXMuZXVbc2ltaWxfZXN0aW1hdGVzJENvdW50cnk9PSAiUFJUIiAmIHNpbWlsX2VzdGltYXRlcyRZZWFyID4xOTg1XSA8LSBUUlVFCgojZm91cnRoIHdhdmUKc2ltaWxfZXN0aW1hdGVzJGlzLmV1W3NpbWlsX2VzdGltYXRlcyRDb3VudHJ5PT0gIkFVVCIgJiBzaW1pbF9lc3RpbWF0ZXMkWWVhciA+MTk5NF0gPC0gVFJVRQpzaW1pbF9lc3RpbWF0ZXMkaXMuZXVbc2ltaWxfZXN0aW1hdGVzJENvdW50cnk9PSAiRklOIiAmIHNpbWlsX2VzdGltYXRlcyRZZWFyID4xOTk0XSA8LSBUUlVFCnNpbWlsX2VzdGltYXRlcyRpcy5ldVtzaW1pbF9lc3RpbWF0ZXMkQ291bnRyeT09ICJTV0UiICYgc2ltaWxfZXN0aW1hdGVzJFllYXIgPjE5OTRdIDwtIFRSVUUKCiNmaWZ0aCB3YXZlCnNpbWlsX2VzdGltYXRlcyRpcy5ldVtzaW1pbF9lc3RpbWF0ZXMkQ291bnRyeT09ICJDWkUiICYgc2ltaWxfZXN0aW1hdGVzJFllYXIgPjIwMDNdIDwtIFRSVUUKc2ltaWxfZXN0aW1hdGVzJGlzLmV1W3NpbWlsX2VzdGltYXRlcyRDb3VudHJ5PT0gIkhVTiIgJiBzaW1pbF9lc3RpbWF0ZXMkWWVhciA+MjAwM10gPC0gVFJVRQpzaW1pbF9lc3RpbWF0ZXMkaXMuZXVbc2ltaWxfZXN0aW1hdGVzJENvdW50cnk9PSAiUE9MIiAmIHNpbWlsX2VzdGltYXRlcyRZZWFyID4yMDAzXSA8LSBUUlVFCnNpbWlsX2VzdGltYXRlcyRpcy5ldVtzaW1pbF9lc3RpbWF0ZXMkQ291bnRyeT09ICJFU1QiICYgc2ltaWxfZXN0aW1hdGVzJFllYXIgPjIwMDNdIDwtIFRSVUUKc2ltaWxfZXN0aW1hdGVzJGlzLmV1W3NpbWlsX2VzdGltYXRlcyRDb3VudHJ5PT0gIkxWQSIgJiBzaW1pbF9lc3RpbWF0ZXMkWWVhciA+MjAwM10gPC0gVFJVRQpzaW1pbF9lc3RpbWF0ZXMkaXMuZXVbc2ltaWxfZXN0aW1hdGVzJENvdW50cnk9PSAiTFRVIiAmIHNpbWlsX2VzdGltYXRlcyRZZWFyID4yMDAzXSA8LSBUUlVFCnNpbWlsX2VzdGltYXRlcyRpcy5ldVtzaW1pbF9lc3RpbWF0ZXMkQ291bnRyeT09ICJDWVAiICYgc2ltaWxfZXN0aW1hdGVzJFllYXIgPjIwMDNdIDwtIFRSVUUKc2ltaWxfZXN0aW1hdGVzJGlzLmV1W3NpbWlsX2VzdGltYXRlcyRDb3VudHJ5PT0gIk1MVCIgJiBzaW1pbF9lc3RpbWF0ZXMkWWVhciA+MjAwM10gPC0gVFJVRQpzaW1pbF9lc3RpbWF0ZXMkaXMuZXVbc2ltaWxfZXN0aW1hdGVzJENvdW50cnk9PSAiU1ZLIiAmIHNpbWlsX2VzdGltYXRlcyRZZWFyID4yMDAzXSA8LSBUUlVFCnNpbWlsX2VzdGltYXRlcyRpcy5ldVtzaW1pbF9lc3RpbWF0ZXMkQ291bnRyeT09ICJTVk4iICYgc2ltaWxfZXN0aW1hdGVzJFllYXIgPjIwMDNdIDwtIFRSVUUKCiNzaXh0aCB3YXZlCnNpbWlsX2VzdGltYXRlcyRpcy5ldVtzaW1pbF9lc3RpbWF0ZXMkQ291bnRyeT09ICJCR1IiICYgc2ltaWxfZXN0aW1hdGVzJFllYXIgPjIwMDZdIDwtIFRSVUUKc2ltaWxfZXN0aW1hdGVzJGlzLmV1W3NpbWlsX2VzdGltYXRlcyRDb3VudHJ5PT0gIlJPVSIgJiBzaW1pbF9lc3RpbWF0ZXMkWWVhciA+MjAwNl0gPC0gVFJVRQoKI3NldmVudGggd2F2ZQpzaW1pbF9lc3RpbWF0ZXMkaXMuZXVbc2ltaWxfZXN0aW1hdGVzJENvdW50cnk9PSAiSFJWIiAmIHNpbWlsX2VzdGltYXRlcyRZZWFyID4yMDEyXSA8LSBUUlVFCmBgYAoKCkNyZWF0aW5nIGF2ZXJhZ2VzIGFuZCBzdGFuZGFyZCBkZXZpYXRpb25zIGZvciBFVSBtZW1iZXIgc3RhdGVzLgoKYGBge3J9CmV1X3NpbSA8LSBzdW1tYXJpc2UoZ3JvdXBfYnkoZmlsdGVyKHNpbWlsX2VzdGltYXRlcywgaXMuZXU9PVRSVUUpLCBZZWFyKSwgCiAgICAgICAgICAgICAgICAgICAgICBzaW1pbF9wcmVzID0gbWVhbihQUkVTKSwgc2Rfc2ltaWxfcHJlcyA9IHNkKFBSRVMpLCAKICAgICAgICAgICAgICAgICAgICAgIHNpbWlsX3ByZXNfZWMgPSBtZWFuKFBSRVNfZWMpLCBzZF9zaW1pbF9wcmVzX2VjID0gc2QoUFJFU19lYyksCiAgICAgICAgICAgICAgICAgICAgICBzaW1pbF9sdXggPSBtZWFuKExVWCwgbmEucm0gPSBUUlVFKSwgc2Rfc2ltaWxfbHV4ID0gc2QoTFVYLCBuYS5ybSA9IFRSVUUpKQoKYGBgCgoKUGxvdHRpbmcgYXZlcmFnZXMgYW5kIHN0YW5kYXJkIGRldmlhdGlvbnMgb2Ygc2ltaWxhcml0aWVzCgoKCgpgYGB7cn0KI1Bsb3Qgb2YgYXZlcmFnZSBzaW1pbGFyaXRpZXMKZ2dwbG90KGRhdGEgPSBldV9zaW0pICsKICBnZW9tX3BvaW50KGFlcyh4PVllYXIsIHk9c2ltaWxfbHV4KSwgbmEucm0gPSBUUlVFLCBjb2xvdXIgPSAiYmx1ZSIpICsgCiAgZ2VvbV9zbW9vdGgoYWVzKHg9WWVhciwgeT1zaW1pbF9sdXgpLCBuYS5ybSA9IFRSVUUsIHNlID0gRkFMU0UsIGNvbG91ciA9ICJibHVlIikgKwogIGdlb21fcG9pbnQoYWVzKHg9WWVhciwgeT1zaW1pbF9wcmVzKSwgY29sb3VyID0gImdyZWVuIikgKwogIGdlb21fc21vb3RoKGFlcyh4PVllYXIsIHk9c2ltaWxfcHJlcyksIHNlID0gRkFMU0UsIGNvbG91ciA9ICJncmVlbiIpICsKICBnZW9tX3BvaW50KGFlcyh4PVllYXIsIHk9c2ltaWxfcHJlc19lYyksIGNvbG91ciA9ICJyZWQiKSArCiAgZ2VvbV9zbW9vdGgoYWVzKHg9WWVhciwgeT1zaW1pbF9wcmVzX2VjKSwgc2UgPSBGQUxTRSwgY29sb3VyID0gInJlZCIpICsKICB5bGFiKCJBdmVyYWdlIEVVIHNpbWlsYXJpdGllcyIpICsKICBhbm5vdGF0ZSgidGV4dCIsIHggPSAxOTgzLCB5ID0gMC4xMiwgbGFiZWwgPSAiU2ltaWxhcml0eSB3aXRoIEx1eGVtYm91cmciLCBjb2xvdXIgPSAiYmx1ZSIpICsKICBhbm5vdGF0ZSgidGV4dCIsIHggPSAyMDAwLCB5ID0gMC4yMiwgbGFiZWwgPSAiU2ltaWxhcml0eSB3aXRoIHByZXNpZGVuY3kiLCBjb2xvdXIgPSAicmVkIikgKwogIHRoZW1lX2J3KCkKCmdnc2F2ZSgiYXZzaW1pbC5wZGYiKQoKYGBgCgoKCgpgYGB7cn0KI1Bsb3Qgb2YgU0RzCmdncGxvdChkYXRhID0gZXVfc2ltKSArCiMgIGdlb21fcG9pbnQoYWVzKHg9WWVhciwgeT1zZF9zaW1pbF9sdXgpLCBuYS5ybSA9IFRSVUUsIGNvbG91ciA9ICJibHVlIikgKyAKIyAgZ2VvbV9zbW9vdGgoYWVzKHg9WWVhciwgeT1zZF9zaW1pbF9sdXgpLCBuYS5ybSA9IFRSVUUsIGNvbG91ciA9ICJibHVlIiwgc2UgPSBGQUxTRSkgKwogIGdlb21fcG9pbnQoYWVzKHg9WWVhciwgeT1zZF9zaW1pbF9wcmVzKSwgY29sb3VyID0gImdyZWVuIikgKwogIGdlb21fc21vb3RoKGFlcyh4PVllYXIsIHk9c2Rfc2ltaWxfcHJlcyksIGNvbG91ciA9ICJncmVlbiIsIHNlID0gRkFMU0UpICsKICBnZW9tX3BvaW50KGFlcyh4PVllYXIsIHk9c2Rfc2ltaWxfcHJlc19lYyksIGNvbG91ciA9ICJyZWQiKSArCiAgZ2VvbV9zbW9vdGgoYWVzKHg9WWVhciwgeT1zZF9zaW1pbF9wcmVzX2VjKSwgY29sb3VyID0gInJlZCIsIHNlID0gRkFMU0UpICsKICB5bGFiKCJTRHMgb2YgRVUgc2ltaWxhcml0aWVzIikgKwogIyBhbm5vdGF0ZSgidGV4dCIsIHggPSAyMDAwLCB5ID0gMC4wMywgbGFiZWwgPSAiU2ltaWxhcml0eSB3aXRoIEx1eGVtYm91cmciLCBjb2xvdXIgPSAiYmx1ZSIpICsKICBhbm5vdGF0ZSgidGV4dCIsIHggPSAxOTkwLCB5ID0gMC4wNzUsIGxhYmVsID0gIlNpbWlsYXJpdHkgd2l0aCBwcmVzaWRlbmN5IiwgY29sb3VyID0gInJlZCIpICsKICB0aGVtZV9idygpCgpnZ3NhdmUoInNkc2ltaWwucGRmIikKCgpgYGAKClNpbWlsYXJpdHkgd2l0aCBMdXhlbWJvdXJnCgpgYGB7cn0KI1Bsb3Qgb2YgU0RzCmdncGxvdChkYXRhID0gZXVfc2ltKSArCiAgZ2VvbV9wb2ludChhZXMoeD1ZZWFyLCB5PXNkX3NpbWlsX2x1eCksIG5hLnJtID0gVFJVRSwgY29sb3VyID0gImJsdWUiKSArIAogIGdlb21fc21vb3RoKGFlcyh4PVllYXIsIHk9c2Rfc2ltaWxfbHV4KSwgbmEucm0gPSBUUlVFLCBjb2xvdXIgPSAiYmx1ZSIsIHNlID0gRkFMU0UpICsKIyAgZ2VvbV9wb2ludChhZXMoeD1ZZWFyLCB5PXNkX3NpbWlsX3ByZXMpLCBjb2xvdXIgPSAiZ3JlZW4iKSArCiMgIGdlb21fc21vb3RoKGFlcyh4PVllYXIsIHk9c2Rfc2ltaWxfcHJlcyksIGNvbG91ciA9ICJncmVlbiIsIHNlID0gRkFMU0UpICsKIyAgZ2VvbV9wb2ludChhZXMoeD1ZZWFyLCB5PXNkX3NpbWlsX3ByZXNfZWMpLCBjb2xvdXIgPSAicmVkIikgKwojICBnZW9tX3Ntb290aChhZXMoeD1ZZWFyLCB5PXNkX3NpbWlsX3ByZXNfZWMpLCBjb2xvdXIgPSAicmVkIiwgc2UgPSBGQUxTRSkgKwogIHlsYWIoIlNEcyBvZiBFVSBzaW1pbGFyaXRpZXMiKSArCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMjAwMCwgeSA9IDAuMDMsIGxhYmVsID0gIlNpbWlsYXJpdHkgd2l0aCBMdXhlbWJvdXJnIiwgY29sb3VyID0gImJsdWUiKSArCiMgIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDE5OTAsIHkgPSAwLjA3NSwgbGFiZWwgPSAiU2ltaWxhcml0eSB3aXRoIHByZXNpZGVuY3kiLCBjb2xvdXIgPSAicmVkIikgKwogIHRoZW1lX2J3KCkKCmdnc2F2ZSgic2RzaW1pbGx1eC5wZGYiKQoKCmBgYAoKCkNvbWJpbmluZyBmaWxlcyBmb3Igb3V0cHV0OgoKYGBge3J9CgpyZWFkcjo6d3JpdGVfY3N2KGxlZnRfam9pbihldV9zaW0sIGV1X3Njb3JlcywgYnkgPSAiWWVhciIpLCAiZXVfZXN0aW1hdGVzLmNzdiIpCgpuYW1lcyhwcmVzdXMpWzRdIDwtICJQUkVTVVNfd3Njb3JlIgpuYW1lcyhwcmVzdXNhbHQpWzRdIDwtICJQUkVTVVNfYWx0X3dzY29yZSIKbmFtZXMocHJlc3J1cylbNF0gPC0gIlBSRVNSVVNfd3Njb3JlIgpuYW1lcyhwcmVzcnVzYWx0KVs0XSA8LSAiUFJFU1JVU19hbHRfd3Njb3JlIgpuYW1lcyhkZXJ1cylbNF0gPC0gIkRFUlVTX3dzY29yZSIKbmFtZXMoZGV1c2EpWzRdIDwtICJERVVTQV93c2NvcmUiCm5hbWVzKGx1eHVzKVs0XSA8LSAiTFVYVVNfd3Njb3JlIgpuYW1lcyhsdXhlcnVzKVs0XSA8LSAiTFVYRVJVU193c2NvcmUiCm5hbWVzKHBhbClbNF0gPC0gIlBBTF93c2NvcmUiCm5hbWVzKHJ1c2EpWzRdIDwtICJSVVNBX3dzY29yZSIKbmFtZXMoY2hudXNhKVs0XSA8LSAiQ0hOVVNBX3dzY29yZSIKCnNjb3JlcyA8LSBmdWxsX2pvaW4ocHJlc3VzLCBwcmVzdXNhbHQsIGJ5PWMoIkNvdW50cnkiLCAiWWVhciIpKQpzY29yZXMgPC0gZnVsbF9qb2luKHNjb3JlcywgcHJlc3J1cywgYnk9YygiQ291bnRyeSIsICJZZWFyIikpCnNjb3JlcyA8LSBmdWxsX2pvaW4oc2NvcmVzLCBwcmVzcnVzYWx0LCBieT1jKCJDb3VudHJ5IiwgIlllYXIiKSkKc2NvcmVzIDwtIGZ1bGxfam9pbihzY29yZXMsIGRlcnVzLCBieT1jKCJDb3VudHJ5IiwgIlllYXIiKSkKc2NvcmVzIDwtIGZ1bGxfam9pbihzY29yZXMsIGRldXNhLCBieT1jKCJDb3VudHJ5IiwgIlllYXIiKSkKc2NvcmVzIDwtIGZ1bGxfam9pbihzY29yZXMsIGx1eHVzLCBieT1jKCJDb3VudHJ5IiwgIlllYXIiKSkKc2NvcmVzIDwtIGZ1bGxfam9pbihzY29yZXMsIGx1eGVydXMsIGJ5PWMoIkNvdW50cnkiLCAiWWVhciIpKQpzY29yZXMgPC0gZnVsbF9qb2luKHNjb3JlcywgcGFsLCBieT1jKCJDb3VudHJ5IiwgIlllYXIiKSkKc2NvcmVzIDwtIGZ1bGxfam9pbihzY29yZXMsIHJ1c2EsIGJ5PWMoIkNvdW50cnkiLCAiWWVhciIpKQpzY29yZXMgPC0gZnVsbF9qb2luKHNjb3JlcywgY2hudXNhLCBieT1jKCJDb3VudHJ5IiwgIlllYXIiKSkKCgpzaW1pbF9zY29yZXMgPC0gZnVsbF9qb2luKHNjb3Jlcywgc2ltaWxfZXN0aW1hdGVzLCBieT1jKCJDb3VudHJ5IiwgIlllYXIiKSkKCnJlYWRyOjp3cml0ZV9jc3Yoc2VsZWN0KHNpbWlsX3Njb3Jlc1tvcmRlcihzaW1pbF9zY29yZXMkQ291bnRyeSwgc2ltaWxfc2NvcmVzJFllYXIpLF0sIAogICAgICAgICAgICAgICAgICAgICAgICBjKENvdW50cnksIFllYXIsIFBSRVMsIFBSRVNfZWMsIExVWCwgUlVTQV93c2NvcmUsIENITlVTQV93c2NvcmUsIAogICAgICAgICAgICAgICAgICAgICAgICAgIFBSRVNVU193c2NvcmUsIFBSRVNVU19hbHRfd3Njb3JlLCBQUkVTUlVTX3dzY29yZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgUFJFU1JVU19hbHRfd3Njb3JlLCBERVJVU193c2NvcmUsIERFVVNBX3dzY29yZSwgTFVYVVNfd3Njb3JlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBMVVhFUlVTX3dzY29yZSwgUEFMX3dzY29yZSkpLCAiZXN0aW1hdGVzLmNzdiIpCgpgYGAKCgojI1NwbGluZXMgYW5hbHlzaXMKCmBgYHtyfQpsaWJyYXJ5KHNwbGluZXMpCgpzcGwxIDwtIGxtKHNkX3J1c2EgfiBucyhZZWFyLCBrbm90cyA9IGMoMTk4NiwxOTkzLDE5OTksIDIwMDkpKSwgZGF0YSA9IGV1X3Njb3JlcykKcHJlZDEgPC0gcHJlZGljdChzcGwxLCBzZSA9IFRSVUUpCgpnZ3Bsb3QoZXVfc2NvcmVzLCBhZXMoWWVhciwgc2RfcnVzYSkpICsgCiAgZ2VvbV9yaWJib24oYWVzKHltaW49IHByZWQxJGZpdC0yKnByZWQxJHNlLmZpdCwgeW1heD1wcmVkMSRmaXQrMipwcmVkMSRzZS5maXQpLCAKICAgICAgICAgICAgICBmaWxsID0gImdyZXk3MCIsIGFscGhhID0gLjUpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fbGluZShhZXMoeT1wcmVkMSRmaXQpKSArCiAgdGhlbWVfYncoKSArCiAgICB5bGFiKCJTdGFuZGFyZCBkZXZpYXRpb24gb2Ygd29yZHNjb3JlcyBmb3IgRVUiKSArCiAgZ2d0aXRsZSgiU3BsaW5lcyBmb3IgVVNBLVJ1c3NpYSBkaW1lbnNpb24iKQoKZ2dzYXZlKCJzZFJVU0FzcGxpbmUucGRmIikKCmBgYAoKCgoKCmBgYHtyfQpzcGwyIDwtIGxtKHNkX2NobiB+IG5zKFllYXIsIGtub3RzID0gYygxOTg2LDE5OTMsMTk5OSwgMjAwOSkpLCBkYXRhID0gZXVfc2NvcmVzKQoKcHJlZDIgPC0gcHJlZGljdChzcGwyLCBzZSA9IFRSVUUpCgpnZ3Bsb3QoZXVfc2NvcmVzLCBhZXMoWWVhciwgc2RfY2huKSkgKyAKICBnZW9tX3JpYmJvbihhZXMoeW1pbj0gcHJlZDIkZml0LTIqcHJlZDIkc2UuZml0LCB5bWF4PXByZWQyJGZpdCsyKnByZWQyJHNlLmZpdCksIAogICAgICAgICAgICAgIGZpbGwgPSAiZ3JleTcwIiwgYWxwaGEgPSAuNSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKGFlcyh5PXByZWQyJGZpdCkpICsKICB0aGVtZV9idygpICsKICB5bGFiKCJTdGFuZGFyZCBkZXZpYXRpb24gb2Ygd29yZHNjb3JlcyBmb3IgRVUiKSArCiAgZ2d0aXRsZSgiU3BsaW5lcyBmb3IgVVNBLUNoaW5hIGRpbWVuc2lvbiIpCgoKZ2dzYXZlKCJzZENITnNwbGluZS5wZGYiKQpgYGAKCgoKCgoKCgoKCgoKCgoKCgoKCmBgYHtyfQpzcGwzIDwtIGxtKHNkX3NpbWlsX3ByZXMgfiBucyhZZWFyLCBrbm90cyA9IGMoMTk4NiwxOTkzLDE5OTksIDIwMDkpKSwgZGF0YSA9IGV1X3NpbSkKCnByZWQzIDwtIHByZWRpY3Qoc3BsMywgc2UgPSBUUlVFKQoKZ2dwbG90KGV1X3NpbSwgYWVzKFllYXIsIHNkX3NpbWlsX3ByZXMpKSArIAogIGdlb21fcmliYm9uKGFlcyh5bWluPSBwcmVkMyRmaXQtMipwcmVkMyRzZS5maXQsIHltYXg9cHJlZDMkZml0KzIqcHJlZDMkc2UuZml0KSwgCiAgICAgICAgICAgICAgZmlsbCA9ICJncmV5NzAiLCBhbHBoYSA9IC41KSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUoYWVzKHk9cHJlZDMkZml0KSkgKwogIHRoZW1lX2J3KCkKCmdnc2F2ZSgic2RzaW1pbHNwbGluZS5wZGYiKQoKYGBgCgoKCgoKCgpgYGB7cn0Kc3BsNCA8LSBsbShzZF9zaW1pbF9wcmVzX2VjIH4gbnMoWWVhciwga25vdHMgPSBjKDE5ODYsMTk5MywxOTk5LCAyMDA5KSksIGRhdGEgPSBldV9zaW0pCgpwcmVkNCA8LSBwcmVkaWN0KHNwbDQsIHNlID0gVFJVRSkKCmdncGxvdChldV9zaW0sIGFlcyhZZWFyLCBzZF9zaW1pbF9wcmVzX2VjKSkgKyAKICBnZW9tX3JpYmJvbihhZXMoeW1pbj0gcHJlZDQkZml0LTIqcHJlZDQkc2UuZml0LCB5bWF4PXByZWQ0JGZpdCsyKnByZWQ0JHNlLmZpdCksIAogICAgICAgICAgICAgIGZpbGwgPSAiZ3JleTcwIiwgYWxwaGEgPSAuNSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKGFlcyh5PXByZWQ0JGZpdCkpICsKICB0aGVtZV9idygpCgpnZ3NhdmUoInNkc2ltaWxlY3NwbGluZS5wZGYiKQoKYGBgCgoKCgoKYGBge3J9CmxpYnJhcnkodGlkeXIpCgpsdXhfc2ltIDwtIGV1X3NpbSAlPiUgZHJvcF9uYShzZF9zaW1pbF9sdXgpCgpzcGw1IDwtIGxtKHNkX3NpbWlsX2x1eCB+IG5zKFllYXIsIGtub3RzID0gYygxOTg2LDE5OTMsMTk5OSwgMjAwOSkpLCBkYXRhID0gbHV4X3NpbSkKCnByZWQ1IDwtIHByZWRpY3Qoc3BsNSwgc2UgPSBUUlVFKQoKZ2dwbG90KGx1eF9zaW0sIGFlcyhZZWFyLCBzZF9zaW1pbF9sdXgpKSArIAogIGdlb21fcmliYm9uKGFlcyh5bWluPSBwcmVkNSRmaXQtMipwcmVkNSRzZS5maXQsIHltYXg9cHJlZDUkZml0KzIqcHJlZDUkc2UuZml0KSwgCiAgICAgICAgICAgICAgZmlsbCA9ICJncmV5NzAiLCBhbHBoYSA9IC41KSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUoYWVzKHk9cHJlZDUkZml0KSkgKwogIHRoZW1lX2J3KCkKCmdnc2F2ZSgic2RzaW1pbGx1eHNwbGluZS5wZGYiKQoKYGBgCgoKCgoKClRoZSBjb2VmZmljaWVudHMgaGVyZSBhcmUgZXNzZW50aWFsbHkgc2xvcGVzIG9mIGxpbmVzIGZvciBlYWNoIHNlZ21lbnQuIAoKYGBge3J9CnNjcmVlbnJlZyhsaXN0KHNwbDEsIHNwbDIsIHNwbDMsIHNwbDQpLCBkaWdpdHMgPSAzLCBib2xkID0gMC4wNSwgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1KSwKICAgICAgICAgIHJlb3JkZXIuY29lZiA9IGMoMiwgMywgNCwgNSwgNiwgMSksIAogICAgICAgICAgY3VzdG9tLmNvZWYubmFtZXMgPSBjKCJJbnRlcmNlcHQiLCAiMTk3MC0xOTg2IiwgIjE5ODctMTk5MyIsICIxOTk0LTE5OTkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAwMC0yMDA5IiwgIjIwMTAtcHJlc2VudCBkYXkiKSwgCiAgICAgICAgICBjdXN0b20ubW9kZWwubmFtZXMgPSBjKCJTRCBFVSBvbiBSVVNBIiwgIlNEIEVVIG9uIENITlVTQSIsICJTRCBTaW1pbCBQcmVzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTRCBTaW1pbCBQcmVzIChFQykgIikpCgpgYGAKCgoKYGBge3J9CnRleHJlZyhsaXN0KHNwbDEsIHNwbDIsIHNwbDMsIHNwbDQpLCBkaWdpdHMgPSAzLCBib2xkID0gMC4wNSwgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1KSwKICAgICAgICAgIHJlb3JkZXIuY29lZiA9IGMoMiwgMywgNCwgNSwgNiwgMSksIAogICAgICAgICAgY3VzdG9tLmNvZWYubmFtZXMgPSBjKCJJbnRlcmNlcHQiLCAiMTk3MC0xOTg2IiwgIjE5ODctMTk5MyIsICIxOTk0LTE5OTkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAwMC0yMDA5IiwgIjIwMTAtcHJlc2VudCBkYXkiKSwgCiAgICAgICAgICBjdXN0b20ubW9kZWwubmFtZXMgPSBjKCJTRCBFVSBvbiBSVVNBIiwgIlNEIEVVIG9uIENITlVTQSIsICJTRCBTaW1pbCBQcmVzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTRCBTaW1pbCBQcmVzIChFQykgIikpCgpgYGAKCgoKCgpgYGB7cn0KdGV4cmVnKHNwbDUsIGRpZ2l0cyA9IDMsIGJvbGQgPSAwLjA1LCBzdGFycyA9IGMoMC4wMDEsIDAuMDEsIDAuMDUpLAogICAgICAgICAgcmVvcmRlci5jb2VmID0gYygyLCAzLCA0LCA1LCA2LCAxKSwgCiAgICAgICAgICBjdXN0b20uY29lZi5uYW1lcyA9IGMoIkludGVyY2VwdCIsICIxOTcwLTE5ODYiLCAiMTk4Ny0xOTkzIiwgIjE5OTQtMTk5OSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDAwLTIwMDkiLCAiMjAxMC1wcmVzZW50IGRheSIpLCAKICAgICAgICAgIGN1c3RvbS5tb2RlbC5uYW1lcyA9ICJTRCBTaW1pbCBMdXgiKQoKYGBgCgojIFJlZmVyZW5jZXM=